home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / compcomp / cgrammer / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-19  |  3.3 KB  |  152 lines

  1. #include <stdio.h> 
  2.  
  3. #ifndef CPP
  4. #define CPP "/lib/cpp"
  5. #endif /* CPP */
  6.  
  7. char *progname;
  8. char *c_source_file;
  9. extern char current_file_name[];
  10. extern FILE *yyin;
  11.  
  12. /*  This is main. */
  13.  
  14. int
  15. main (argc, argv)
  16.      int argc;
  17.      char **argv;
  18. {
  19.   char *cpp_cmd_line;
  20.   int nocpp = 0;
  21.   int sz;
  22.   int i;
  23.  
  24.   init_tree_nodes ();
  25.   progname = rindex (argv[0], '/');
  26.   if (0 != progname)
  27.     ++progname;
  28.   else
  29.     progname = argv[0];
  30.  
  31.   if (argc < 2)
  32.     {
  33.       fprintf (stderr, "Usage: %s [-nocpp] [-any valid cpp options] file [file .. ]\n", progname);
  34.       exit (1);
  35.     }
  36.  
  37.   sz = strlen (CPP);
  38.   for (i = 0; i < argc; ++i)
  39.     sz += strlen (argv[i]);
  40.   cpp_cmd_line = (char *) malloc (sz);
  41.   if ((char *)0 == cpp_cmd_line)
  42.     {
  43.       perror (progname);
  44.       exit (1);
  45.     }
  46.   strcpy (cpp_cmd_line, CPP);
  47.   strcat (cpp_cmd_line, " ");
  48.  
  49.   for (i = 1; i < argc && '-' == argv[i][0]; ++i)
  50.     {
  51.       switch (argv[i][1])
  52.     {
  53.     case 'C':
  54.     case 'H':
  55.     case 'M':
  56.     case 'P':
  57.     case 'R':
  58.     case 'T':
  59.     case 'Y':
  60.       strcat (cpp_cmd_line, argv[i]);
  61.       strcat (cpp_cmd_line, " ");
  62.       break;
  63.     case 'I':
  64.     case 'D':
  65.     case 'U':
  66.       strcat (cpp_cmd_line, argv[i]);
  67.       strcat (cpp_cmd_line, " ");
  68.       if (0 == argv[i][2])
  69.         {
  70.           strcat (cpp_cmd_line, argv[i]);
  71.           strcat (cpp_cmd_line, " ");
  72.         }
  73.       break;
  74.     default:
  75.       if (0 == strcmp ("-undef", argv[i]))
  76.         strcat (cpp_cmd_line, "-undef ");
  77.       else if (0 == strcmp ("-nocpp", argv[i]))
  78.         ++nocpp;
  79.       break;
  80.       
  81.     }
  82.     }
  83.  
  84.   if (nocpp)
  85.     {
  86.       for (; i < argc; ++i)
  87.     {
  88.           yyin = fopen (argv[i], "r");
  89.           c_source_file = argv[i];
  90.           strcpy (current_file_name, c_source_file);
  91.  
  92.       if ((FILE *) 0 != stdin)
  93.         {
  94.           int ret;
  95.           ret = yyparse ();
  96.           if (ret)
  97.         exit (1);
  98.           build_prototypes ();
  99.           free_prototypes ();
  100.           fclose (yyin);
  101.         }
  102.       else
  103.         fprintf (stderr, "%s: Can't open <%s>, skipping.\n", progname, argv[i]);
  104.     }
  105.     }
  106.   else
  107.     {
  108.       int ind = strlen (cpp_cmd_line);
  109.       for (; i < argc; ++i)
  110.     {
  111.           strcat (cpp_cmd_line, argv[i]);
  112.       yyin = popen (cpp_cmd_line, "r");
  113.           c_source_file = argv[i];
  114.           strcpy (current_file_name, c_source_file);
  115.  
  116.       if ((FILE *) 0 != stdin)
  117.         {
  118.           int ret;
  119.  
  120.           ret = yyparse ();
  121.           if (ret)
  122.         exit (1);
  123.           build_prototypes ();
  124.           free_prototypes ();
  125.           pclose (yyin);
  126.            cpp_cmd_line[ind] = 0;
  127.         }
  128.     else
  129.       fprintf (stderr, "%s: Couldn't execute cpp line <%s>, skipping.\n", progname, cpp_cmd_line);
  130.     }
  131.     }
  132.   return 0;
  133. }
  134.  
  135. extern char yytext[];
  136. extern int column, old_column;
  137. extern int line_number;
  138.  
  139. yyerror(s)
  140.      char *s;
  141. {
  142.   register int i;
  143.   
  144.   if (0 == strcmp (c_source_file, current_file_name))
  145.     fprintf (stderr, "%s: %s: Syntax error around line %d column %d-%d\n", 
  146.          progname, current_file_name, line_number, old_column, column);
  147.   else
  148.     fprintf (stderr, "%s: %s: Syntax error in header file <%s> around line %d column %d-%d\n",
  149.          progname, c_source_file, current_file_name, line_number, old_column, column);
  150.   exit (1);
  151. }
  152.