genmms.c

来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 751 行 · 第 1/2 页

C
751
字号
      else printf(", %s$(SCAN).c", DIR());
    }
    if ( !gen_CPP ) printf(" $(ERR).c");
    printf("\n");
    printf("OBJ = ");
    pfiles(files, n, "obj");
    if ( gen_CPP ) {
      printf(" ,-\n     ");
      printf(" ");
      pclasses(classes, num_classes, "o");
      printf(" ,-\n      ");
      printf(" %s%s", DIR(), APARSER_O);
      if ( !user_lexer ) {
	printf(", %s%s", DIR(), DLEXERBASE_O);
      }
      if ( gen_trees ) {
	printf(" ,-\n      ");
	printf("%s%s", DIR(), ASTBASE_O);
	printf(", %s%s", DIR(), PCCTSAST_O);
	/*			printf(" %s%s", DIR(), LIST_O); */
      }
      printf(", %s%s", DIR(), ATOKENBUFFER_O);
    }
    if ( !user_lexer ) {
      if ( gen_CPP ) printf(", $(SCAN)%s", OBJ_FILE_SUFFIX);
      else printf(", %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);
    }
    if ( !gen_CPP ) printf(", $(ERR)%s", OBJ_FILE_SUFFIX);
    printf("\n");

    printf("ANTLR_SPAWN = ");
    if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
    else pfiles(files, n, "c");
    if ( gen_CPP ) {
      printf(", ");
      pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
      printf(" ,-\n              ");
      pclasses(classes, num_classes, "h");
      if ( strcmp(hdr,"stdpccts.h")!=0 ) {
	printf(" ,-\n              ");
	printf("$(HDR_FILE), stdpccts.h");
      }
    }
    if ( user_lexer ) {
      if ( !user_token_types ) printf(", $(TOKENS)");
    }
    else {
      printf(", $(DLG_FILE)");
      if ( !user_token_types ) printf(", $(TOKENS)");
    }
    if ( !gen_CPP ) printf(", $(ERR).c");
    printf("\n");

    if ( !user_lexer ) {
      if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);
      else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
      if ( gen_CPP ) printf(", $(SCAN).h");
      else printf(", $(MOD_FILE)");
      printf("\n");
    }

    printf("ANTLR_SPAWN_ALL_VERSIONS = ");
    if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
    else pfiles(files, n, "c");
    if ( gen_CPP ) {
      printf(";*, ");
      pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
      printf(";* ,-\n              ");
      pclasses(classes, num_classes, "h");
      printf(";*");
      if ( strcmp(hdr,"stdpccts.h")!=0 ) {
	printf(" ,-\n              ");
	printf("$(HDR_FILE);*, stdpccts.h;*");
      }
    }
    if ( user_lexer ) {
      if ( !user_token_types ) printf(", $(TOKENS);*");
    }
    else {
      printf(", $(DLG_FILE);*");
      if ( !user_token_types ) printf(", $(TOKENS);*");
    }
    if ( !gen_CPP ) printf(", $(ERR).c;*");
    printf("\n");

    if ( !user_lexer ) {
      if ( gen_CPP ) printf("DLG_SPAWN_ALL_VERSIONS = $(SCAN)%s;*", CPP_FILE_SUFFIX);
      else printf("DLG_SPAWN_ALL_VERSIONS = %s$(SCAN).c;*", DIR());
      if ( gen_CPP ) printf(", $(SCAN).h;*");
      else printf(", $(MOD_FILE);*");
      printf("\n");
    }

    if ( gen_CPP ) {
      printf("CCC=CXX\n");
      printf("CC=$(CCC)\n");
    }
    else printf("CC=cc\n");

    /* set up dependencies */
    printf("\n%s.exe : $(OBJ), $(SRC)\n", project);
    if (gen_CPP)
      printf("	CXXLINK %s %s $(LNKFLAGS) $(OBJ)\n",
	     RENAME_EXE_FLAG,
	     project);
    else
      printf("	LINK %s %s $(LNKFLAGS) $(OBJ)\n",
	     RENAME_EXE_FLAG,
	     project);
    printf("\n");

    /* how to compile parser files */

    for (i=0; i<num_files; i++)
      {
	pfiles(&files[i], 1, "obj");
	if ( user_lexer ) {
	  printf(" : $(TOKENS)");
	}
	else {
	  if ( gen_CPP ) printf(" : $(TOKENS), $(SCAN).h");
	  else printf(" : $(MOD_FILE), $(TOKENS)");
	}
	printf(", ");
	if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
	else pfiles(&files[i], 1, "c");
	if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
	printf("\n");
	printf("	%s $(CFLAGS) %s ",gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
	pfiles(&files[i], 1, "obj");
	printf(" ");
	if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
	else pfiles(&files[i], 1, "c");
	printf("\n\n");
      }

    /* how to compile err.c */
    if ( !gen_CPP ) {
      printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);
      if ( !user_lexer ) printf(", $(TOKENS)");
      printf("\n");
      printf("	%s $(CFLAGS) %s $(ERR)%s $(ERR).c",
	     gen_CPP?"$(CCC)":"$(CC)",
	     RENAME_OBJ_FLAG,
	     OBJ_FILE_SUFFIX);
      printf("\n\n");
    }

    /* how to compile Class.c */
    for (i=0; i<num_classes; i++)
      {
	pclasses(&classes[i], 1, "obj");
	if ( user_lexer ) {
	  printf(" : $(TOKENS)");
	}
	else {
	  printf(" : $(TOKENS), $(SCAN).h");
	}
	printf(", ");
	pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
	printf(", ");
	pclasses(&classes[i], 1, "h");
	if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
	printf("\n");
	printf("	%s $(CFLAGS) %s ",
	       gen_CPP?"$(CCC)":"$(CC)",
	       RENAME_OBJ_FLAG);
	pclasses(&classes[i], 1, "obj");
	printf(" ");
	pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
	printf("\n\n");
      }

    /* how to compile scan.c */
    if ( !user_lexer ) {
      if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);
      else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());
      if ( !user_lexer ) printf(", $(TOKENS)");
      printf("\n");
      if ( gen_CPP ) printf("	$(CCC) $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",
			    RENAME_OBJ_FLAG,
			    OBJ_FILE_SUFFIX,
			    CPP_FILE_SUFFIX);
      else printf("	$(CC) $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
		  RENAME_OBJ_FLAG,
		  DIR(),
		  OBJ_FILE_SUFFIX,
		  DIR());
      printf("\n\n");
    }

    printf("$(ANTLR_SPAWN) : $(GRM)\n");
    printf("	$(ANTLR) $(AFLAGS) $(GRM)\n");

    if ( !user_lexer )
      {
	printf("\n");
	printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
	if ( gen_CPP ) printf("	$(DLG) $(DFLAGS) $(DLG_FILE)\n");
	else printf("	$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
      }

    /* do the makes for ANTLR/DLG support */
    if ( gen_CPP ) {
      printf("\n");
      printf("%s%s : $(ANTLR_H)%s\n", DIR(), APARSER_O, APARSER_C);
      printf("	%s $(CFLAGS) %s ",
	     gen_CPP?"$(CCC)":"$(CC)",
	     RENAME_OBJ_FLAG);
      printf("%s%s $(ANTLR_H)%s\n", DIR(), APARSER_O, APARSER_C);
      printf("\n");
      printf("%s%s : $(ANTLR_H)%s\n", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
      printf("	%s $(CFLAGS) %s ",
	     gen_CPP?"$(CCC)":"$(CC)",
	     RENAME_OBJ_FLAG);
      printf("%s%s $(ANTLR_H)%s\n", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
      if ( !user_lexer ) {
	printf("\n");
	printf("%s%s : $(ANTLR_H)%s\n", DIR(), DLEXERBASE_O, DLEXERBASE_C);
	printf("	%s $(CFLAGS) %s ",
	       gen_CPP?"$(CCC)":"$(CC)",
	       RENAME_OBJ_FLAG);
	printf("%s%s $(ANTLR_H)%s\n", DIR(), DLEXERBASE_O, DLEXERBASE_C);
      }
      if ( gen_trees ) {
	printf("\n");
	printf("%s%s : $(ANTLR_H)%s\n", DIR(), ASTBASE_O, ASTBASE_C);
	printf("	%s $(CFLAGS) %s ",
	       gen_CPP?"$(CCC)":"$(CC)",
	       RENAME_OBJ_FLAG);
	printf("%s%s $(ANTLR_H)%s\n", DIR(), ASTBASE_O, ASTBASE_C);
	printf("\n");
	printf("%s%s : $(ANTLR_H)%s\n", DIR(), PCCTSAST_O, PCCTSAST_C);
	printf("	%s $(CFLAGS) %s ",
	       gen_CPP?"$(CCC)":"$(CC)",
	       RENAME_OBJ_FLAG);
	printf("%s%s $(ANTLR_H)%s\n", DIR(), PCCTSAST_O, PCCTSAST_C);
	printf("\n");
	/*
	  printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
	  printf("	%s -c $(CFLAGS) %s ",
	  gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
	  printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
	  */
      }
    }

    /* clean and scrub targets */

    printf("\nclean :\n");
    printf("	delete *%s.*,  %s.exe.*", OBJ_FILE_SUFFIX, project);
    if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s;*", DIR(), OBJ_FILE_SUFFIX);
    printf("\n");

    printf("\nscrub :\n");
    printf("	delete *%s.*,  %s.exe;*", OBJ_FILE_SUFFIX, project);
    if ( strcmp(outdir, ".")!=0 ) printf(", %s*%s.*", DIR(), OBJ_FILE_SUFFIX);
    printf(", $(ANTLR_SPAWN_ALL_VERSIONS)");
    if ( !user_lexer ) printf(", $(DLG_SPAWN_ALL_VERSIONS)");
    printf("\n");
}

void pfiles(files, n, suffix)
char **files;
int n;
char *suffix;
{
  int first=1;

  while ( n>0 )
    {
      char *p = &(*files)[strlen(*files)-1];
      if ( !first ) putchar(' ');
      first=0;
      while ( p > *files && *p != '.' ) --p;
      if ( p == *files )
	{
	  fprintf(stderr,
		  "genmk: filenames must be file.suffix format: %s\n",
		  *files);
	  exit(-1);
	}
      if ( suffix == NULL ) printf("%s", *files);
      else
	{
	  *p = '\0';
	  printf("%s", DIR());
	  if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);
	  else printf("%s.%s", *files, suffix);
	  *p = '.';
	}
      files++;
      --n;
    }
}

void pclasses(classes, n, suffix)
char **classes;
int n;
char *suffix;
{
	int first=1;

	while ( n>0 )
	{
		if ( !first ) putchar(' ');
		first=0;
		if ( suffix == NULL ) printf("%s", *classes);
		else {
			printf("%s", DIR());
			if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);
			else printf("%s.%s", *classes, suffix);
		}
		classes++;
		--n;
	}
}

static void
#ifdef __STDC__
ProcessArgs( int argc, char **argv, Opt *options )
#else
ProcessArgs( argc, argv, options )
int argc;
char **argv;
Opt *options;
#endif
{
	Opt *p;
	require(argv!=NULL, "ProcessArgs: command line NULL");

	while ( argc-- > 0 )
	{
		p = options;
		while ( p->option != NULL )
		{
			if ( strcmp(p->option, "*") == 0 ||
				 strcmp(p->option, *argv) == 0 )
			{
				if ( p->arg )
				{
					(*p->process)( *argv, *(argv+1) );
					argv++;
					argc--;
				}
				else
					(*p->process)( *argv );
				break;
			}
			p++;
		}
		argv++;
	}
}

void fatal(char *err_)
{
    fprintf(stderr, "genmk: %s\n", err_);
    exit(1);
}

void warn(char *err_)
{
    fprintf(stderr, "genmk: %s\n", err_);
}

char *DIR()
{
	static char buf[200+1];
	
	if ( strcmp(outdir,TopDirectory)==0 ) return "";
	sprintf(buf, "%s", outdir);
	return buf;
}

⌨️ 快捷键说明

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