⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcf-depend.c

📁 gcc-2.95.3 Linux下最常用的C编译器
💻 C
字号:
/* Functions for handling dependency tracking when reading .class files.   Copyright (C) 1998  Free Software Foundation, Inc.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA.  Java and all Java-based marks are trademarks or registered trademarksof Sun Microsystems, Inc. in the United States and other countries.The Free Software Foundation is independent of Sun Microsystems, Inc.  *//* Written by Tom Tromey <tromey@cygnus.com>, October 1998.  */#include "config.h"#include "system.h"#include <assert.h>#include "jcf.h"/* We keep a linked list of all the files we've already read.  */struct entry{  char *file;  struct entry *next;};/* List of files.  */static struct entry *dependencies = NULL;/* Name of targets.  We support multiple targets when writing .class   files.  */static struct entry *targets = NULL;/* Number of columns in output.  */#define MAX_OUTPUT_COLUMNS 72/* The output file, or NULL if we aren't doing dependency tracking.  */static FILE *dep_out = NULL;/* Nonzero if system files should be added.  */static int system_files;/* Helper to free an entry list.  */static voidfree_entry (entp)     struct entry **entp;{  struct entry *ent, *next;  for (ent = *entp; ent != NULL; ent = next)    {      next = ent->next;      free (ent->file);      free (ent);    }  *entp = NULL;}/* Helper to add to entry list.  */static voidadd_entry (entp, name)     struct entry **entp;     char *name;{  struct entry *ent;  for (ent = *entp; ent != NULL; ent = ent->next)    if (! strcmp (ent->file, name))      return;  ent = (struct entry *) malloc (sizeof (struct entry));  ent->file = strdup (name);  ent->next = *entp;  *entp = ent;}/* Call this to reset the dependency module.  This is required if   multiple dependency files are being generated from a single tool   invocation.  */voidjcf_dependency_reset (){  free_entry (&dependencies);  free_entry (&targets);  if (dep_out != NULL)    {      if (dep_out != stdout)	fclose (dep_out);      dep_out = NULL;    }}voidjcf_dependency_set_target (name)     char *name;{  free_entry (&targets);  if (name != NULL)    add_entry (&targets, name);}voidjcf_dependency_add_target (name)     char *name;{  add_entry (&targets, name);}voidjcf_dependency_set_dep_file (name)     const char *name;{  assert (dep_out != stdout);  if (dep_out)    fclose (dep_out);  if (! strcmp (name, "-"))    dep_out = stdout;  else    dep_out = fopen (name, "w");}voidjcf_dependency_add_file (filename, system_p)     const char *filename;     int system_p;{  /* Just omit system files.  */  if (system_p && ! system_files)    return;  add_entry (&dependencies, filename);}voidjcf_dependency_init (system_p)     int system_p;{  system_files = system_p;}/* FIXME: this is taken almost directly from cccp.c.  Such duplication   is bad.  */static char *munge (filename)     char *filename;{  static char *buffer = NULL;  static int buflen = 0;  int len = 2 * strlen (filename) + 1;  char *p, *dst;  if (buflen < len)    {      buflen = len;      if (buffer == NULL)	buffer = malloc (buflen);      else	buffer = realloc (buffer, buflen);    }  dst = buffer;  for (p = filename; *p; ++p)    {      switch (*p)	{	case ' ':	case '\t':	  {	    /* GNU make uses a weird quoting scheme for white space.	       A space or tab preceded by 2N+1 backslashes represents	       N backslashes followed by space; a space or tab	       preceded by 2N backslashes represents N backslashes at	       the end of a file name; and backslashes in other	       contexts should not be doubled.  */	    char *q;	    for (q = p - 1; filename < q && q[-1] == '\\';  q--)	      *dst++ = '\\';	  }	  *dst++ = '\\';	  goto ordinary_char;	case '$':	  *dst++ = '$';	  /* Fall through.  This can mishandle things like "$(" but	     there's no easy fix.  */	default:	ordinary_char:	  /* This can mishandle characters in the string "\0\n%*?[\\~";	     exactly which chars are mishandled depends on the `make' version.	     We know of no portable solution for this;	     even GNU make 3.76.1 doesn't solve the problem entirely.	     (Also, '\0' is mishandled due to our calling conventions.)  */	  *dst++ = *p;	  break;	}    }  *dst++ = '\0';  return buffer;}/* Helper to print list of files.  */static intprint_ents (ent, column)     struct entry *ent;     int column;{  int first = 1;  for (; ent != NULL; ent = ent->next)    {      char *depname = munge (ent->file);      int len = strlen (depname);      if (column + len + 2 > MAX_OUTPUT_COLUMNS)	{	  fprintf (dep_out, " \\\n ");	  column = 1;	}      if (! first)	fputs (" ", dep_out);      fputs (depname, dep_out);      first = 0;      column += len + 1;    }  return column;}voidjcf_dependency_write (){  int column = 0;  if (! dep_out)    return;  assert (targets);  column = print_ents (targets, 0);  fputs (" : ", dep_out);  print_ents (dependencies, column);  fputs ("\n", dep_out);  fflush (dep_out);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -