/*********************************************************************/ /* pC++/Sage++ Copyright (C) 1993 */ /* Indiana University University of Oregon University of Rennes */ /*********************************************************************/ /* * main.c --- Calls parser, dependence graph analyzer, subscript analyzer. * Opens and closes the files that are needed. */ #include #include "compatible.h" #ifdef SYS5 #include #else #include #endif #ifdef WIN #define SLASH_ "\\" #else #define SLASH_ "/" #endif #include #include #include #include "db.h" #include "defines.h" #include "version.h" #include "fdvm_version.h" typedef FILE *FILEP; #ifdef __SPF #ifndef __SPF_BUILT_IN_PARSER void addToCollection(const int line, const char *file, void *pointer, int type) { } void removeFromCollection(void *pointer) { } #else #define HPF_program HPF_program_ #define OMP_program OMP_program_ #define ACC_program ACC_program_ #define deb_mpi deb_mpi_ #endif #endif extern int yylineno, yyleng, yylisting, yylonglines, yydebug; extern int parstate; extern char * infname; extern int errcnt, prflag, errline, num_files; extern PTR_BFND global_bfnd; extern PTR_BLOB head_blob; extern PTR_FNAME head_file,cur_thread_file; extern int num_bfnds; /* total # of bif nodes */ extern int num_llnds; /* total # of low level nodes */ extern int num_symbs; /* total # of symbol nodes */ extern int num_types; /* total # of types nodes */ extern int num_blobs; /* total # of blob nodes */ extern int num_sets; /* total # of set nodes */ extern int num_cmnt; extern int num_def; /* total # of dependncy nodes */ extern int num_dep; extern int num_label; /* total # of label nodes */ extern PTR_BFND head_bfnd, /* start of bfnd chain */ cur_bfnd; /* poextern int to current bfnd */ extern PTR_LLND head_llnd, cur_llnd; extern PTR_SYMB head_symb, cur_symb; extern PTR_TYPE head_type, cur_type; extern PTR_LABEL head_label, cur_label; extern PTR_FNAME head_file,cur_thread_file; extern PTR_BLOB head_blob, cur_blob; extern PTR_SETS head_sets, cur_sets; extern PTR_DEF head_def, cur_def; extern PTR_DEFLST head_deflst, cur_deflst; extern PTR_DEP head_dep, cur_dep, pre_dep; extern PTR_CMNT head_cmnt, cur_cmnt; extern PTR_CMNT cur_comment; PTR_TYPE global_unknown = NULL; int _filbuf(); PTR_SETS build_sets(); int relink(); int write_nodes(); int fclose(); int inilex(); int dbginilex(); int yyparse(); PTR_BFND get_bfnd(); void fatalstr(), initialize(), errstr(), release_nodes(), close_files(); void errstr_fatal(), err_fatal(); void make_file_list(); char *copys(); char *getenv(); int system(); void free(); void exit(); void err(); char* chkalloc(); int UnparseFDVMProgram(); void PrepareSourceFileForDebug (); /*OMP*/ extern int language; extern int warn_all; /*int language = ForSrc;*/ FILE *outf; static char *defeditor = "/usr/ucb/vi +%d %s"; int show_deps = 0; /* set to 1 by -sd flag */ int garb_collect = 1; /* disabled by -c flag */ /*static int dep = 0;*/ static int dvm_debug = 0; /*set to 1 by -d1 ...-d4 flags */ /*int only_debug = 0; */ /*set to 1 by -s flag */ /*int level_debug = 0; */ /*set to 1 by -d1 flag, to 2 by -d2 flag and so on */ /*int perf_analysis =0; */ /*set to 1 by -e1 flag, to 2 by -e2 flag and so on */ static int v_print = 0; /*set to 1 by -v flag */ /*int warn_all = 0; */ /*set to 1 by -w flag */ int HPF; extern int HPF_VERSION; int HPF_program; int OMP_program; /*OMP*/ int ACC_program; /*ACC*/ int SAPFOR; /*SPF*/ int free_form; int source_form_by_option; int ftn_std; int d_line; int deb_mpi; int extend_source; int nchars_per_line; char *outname; PTR_FILE fi; extern PTR_FILE cur_file; struct include_dir { struct include_dir *next; char *dir_name; }; /*list of directories for "include"*/ struct include_dir *incl_first = NULL; /*set by -I flag */ struct include_dir *incl_last; int is_integer_value(str) char *str; { if(!str) return 0; for( ; *str != '\0'; str++) if (! isdigit(*str)) return 0; return 1; } void gen_out_name(const char *filename) { register int i; char *q, *r; if (!filename) return; outname = (char *)malloc((unsigned)(strlen(filename) + 4)); strcpy(outname, filename); for (i = strlen(filename) - 1; i >= 0; i--) { if (filename[i] == '.') { q = &(outname[i + 1]); break; } } if (i < 0) { q = &(outname[strlen(filename)]); *q++ = '.'; } /*else if (!strcmp(q,"hpf"))*/ else if ((q[0] == 'h' || q[0] == 'H') && (q[1] == 'p' || q[1] == 'P') && (q[2] == 'f' || q[2] == 'F') && (q[3] == '\0')) HPF_program = 1; /* else if ((q[0] == 'f' || q[0] == 'F') && (q[1] == 'd' || q[1] == 'D') && (q[2] == 'v' || q[2] == 'V') && (q[3] =='\0')) ; */ /* else if (deb_mpi && ( ((q[0] == 'f' || q[0] == 'F') && q[1] == '\0') || ((q[0] == 'f' || q[0] == 'F') && q[1] == '9' && q[2] == '0' && q[3] == '\0' ) )) */ /* else if (deb_mpi && (!strcmp(q,"f") || !strcmp(q,"F") || !strcmp(q,"f90") || !strcmp(q,"F90") ) ) */ /* else if (deb_mpi || ftn_std ) ; */ /* else errstr_fatal("Invalid source file %s ", filename, 300); */ #if 0 /* OBSOLETE */ for (i = strlen(p), q = outname; i; i--) if ((*q++ = *p++) == '.') { dot = 1; break; } #endif /* OBSOLETE */ r = q; if (yylisting) { *q++ = 'l'; *q++ = 's'; *q++ = 't'; *q = '\0'; if ((outf = fopen(outname, "w")) == NULL) errstr_fatal("Can't open file %s for write", outname, 6); } if (HPF) { *r++ = 'h'; *r++ = 'p'; *r++ = 'f'; } else { *r++ = 'd'; *r++ = 'e'; *r++ = 'p'; } *r = '\0'; } int SourceFormByName (filename) char *filename; { register int i; char *q; for (i = strlen(filename)-1 ; i >= 0 ; i --) { if ( filename[i] == '.' ) { q = &(filename[i+1]); break; } } if (i<0) return(0); /* fix source form by default */ else if (!strcmp(q,"f90") || !strcmp(q,"F90") ) return(1); /* free source form by default */ else return(0); /* fix source form by default */ } void add_include_list(dirname) char *dirname; { struct include_dir *in; char *namep = (char *) malloc((unsigned)(strlen(dirname)+1)); (void)strcpy(namep, dirname); in = (struct include_dir *) chkalloc(sizeof(struct include_dir)); in->next = NULL; in->dir_name = namep; if(!incl_first) { incl_first = in; incl_last = in; } else { incl_last->next = in; incl_last = in; } } FILE * open_include_file(name) char *name; { char *whole_name,*p; FILE *fincl; struct include_dir *incld; for(p=name; (*p != '\0'); p++) if(*p == *SLASH_){ fincl = fopen(name, "r"); return(fincl); } for(incld=incl_first; incld; incld=incld->next) { whole_name =(char *) malloc((unsigned)(strlen(incld->dir_name)+strlen(name)+2)); strcpy(whole_name,incld->dir_name); strcat(whole_name,SLASH_); strcat(whole_name,name); fincl = fopen(whole_name, "r"); if(fincl) return(fincl); } fincl = fopen(name, "r"); return(fincl); } void FragmentList(char *str) { cur_num: if(!isdigit(*str)) { (void)fprintf (stderr, "Warning 002: invalid option argument %s is ignored\n", str); return; } for(str++; (*str != '\0' && *str != ',' && *str != '-'); str++) if(!isdigit(*str)) { (void)fprintf (stderr, "Warning 002: invalid option argument %s is ignored\n", str); return; } if(*str == '\0') return; str = str+1; goto cur_num; return; } #ifdef __SPF_BUILT_IN_PARSER int parse_file(int argc, char* argv[], char* proj_name) #else int main(int argc, char *argv[]) #endif { #ifndef __SPF_BUILT_IN_PARSER char *proj_name = "dvm.proj"; #endif FILE *fproj; int k; int fromfile = (argv != 0); /* Flag to see if read from a file */ void procinit(); char *input_file = NULL; char *debug_file;/*OMP*/ char *output_file = NULL; int gendeps(); int collect_garbage(); int no = 0; int ad = 0; HPF = 0; warn_all = 0; HPF_program = 0; OMP_program = 0; /*OMP*/ ACC_program = 0; /*ACC*/ SAPFOR = 0; /*SPF*/ /* free_form = 0; */ source_form_by_option = 0; ftn_std = 0; d_line = 0; deb_mpi = 0; extend_source = 0; nchars_per_line = 72 - 6; #ifdef __SPF int noProject = 0; #endif argv++; while ((argc > 1) && (*argv)[0] == '-') { if ((*argv)[1] == 'D') yydebug = 1; else if ((*argv)[1] == 'I') add_include_list((*argv) + 2); else if (!strcmp(argv[0], "-o")) { output_file = argv[1]; no++; argv++; argc--; } else if (!strcmp(argv[0], "-a")) { proj_name = argv[1]; ad++; argv++; argc--; } else if (!strcmp(argv[0], "-d_line")) d_line = 1; else if (!strcmp(argv[0], "-dc")) ; else if (!strcmp(argv[0], "-dbif1")) ; else if (!strcmp(argv[0], "-dbif2")) ; else if (!strcmp(argv[0], "-dnoind")) ; else if (!strcmp(argv[0], "-dvmLoopAnalysisEC")) /*ACC*/ ; else if (!strcmp(argv[0], "-dvmLoopAnalysis")) /*ACC*/ ; else if (!strcmp(argv[0], "-dvmPrivateAnalysis")) /*ACC*/ ; else if (!strcmp(argv[0], "-dvmIrregAnalysis")) /*ACC*/ ; else if (!strcmp(argv[0], "-speedL0")) /*ACC*/ ; else if (!strcmp(argv[0], "-speedL1")) /*ACC*/ ; else if (!strcmp(argv[0], "-byFunUnparse")) ; else if (!strcmp(argv[0], "-dmpi")) deb_mpi = 1; else if (!strcmp(argv[0], "-dperf")) dvm_debug = 5; else if (!strcmp(argv[0], "-emp")) ; else if (!strcmp(argv[0], "-extend_source")) { extend_source = 132; nchars_per_line = extend_source - 6; } else if (((*argv)[1] == 'd') || ((*argv)[1] == 'e')) { if ((*argv)[1] == 'd') { switch ((*argv)[2]) { case '0': dvm_debug = 0; break; /*OMP*/ case '1': dvm_debug = 1; break; /*OMP*/ case '2': dvm_debug = 2; break; /*OMP*/ case '3': dvm_debug = 3; break; /*OMP*/ case '4': dvm_debug = 4; break; /*OMP*/ /*case '5':*/ break; default: goto ERR; } } else if ((*argv)[1] == 'e') { /*OMP*/ switch ((*argv)[2]) { /*OMP*/ case '0': /*OMP*/ case '1': /*OMP*/ case '2': /*OMP*/ case '3': /*OMP*/ case '4': /*OMP*/ /*case '5':*/ break;/*OMP*/ default: /*OMP*/ goto ERR; /*OMP*/ } /*OMP*/ } if ((*argv)[3] == ':') FragmentList(*argv + 4); else if ((*argv)[3] != '\0') goto ERR; } else if (!strcmp(argv[0], "-spf")) SAPFOR = 1; else if (!strcmp(argv[0], "-p")) HPF = 0; else if (!strcmp(argv[0], "-s")) HPF = 0; else if (!strcmp(argv[0], "-v")) v_print = 1; else if (!strcmp(argv[0], "-w")) warn_all = 1; else if (!strcmp(argv[0], "-t8")) ; else if (!strcmp(argv[0], "-t4")) ; else if (!strcmp(argv[0], "-r8")) ; else if (!strcmp(argv[0], "-i8")) ; else if (!strcmp(argv[0], "-bind0")) ; else if (!strcmp(argv[0], "-bind1")) ; else if (!strcmp(argv[0], "-mp")) /*OMP*/ OMP_program = 1; else if (!strncmp(argv[0], "-bufio", 6)) { if ((*argv)[6] == '\0' || (!is_integer_value(*argv + 6))) goto ERR; } else if (!strncmp(argv[0], "-bufUnparser", 12)) { if ((*argv)[12] == '\0' || (!is_integer_value(*argv + 12))) goto ERR; } else if (!strcmp(argv[0], "-ioRTS")) ; else if (!strcmp(argv[0], "-read_all")) ; else if (!strncmp(argv[0], "-collapse", 9)) { if ((*argv)[9] == '\0' || (!is_integer_value(*argv + 9))) goto ERR; } else if (!strcmp(argv[0], "-Obase")) ; else if (!strcmp(argv[0], "-Oloop_range")) ; else if (!strcmp(argv[0], "-hpf")) { HPF = 1; HPF_VERSION = 2; } else if (!strcmp(argv[0], "-hpf1")) { HPF = 1; HPF_VERSION = 1; } else if (!strcmp(argv[0], "-hpf2")) { HPF = 1; HPF_VERSION = 2; } else if (!strcmp(argv[0], "-f90")) { free_form = 1; source_form_by_option = 1; } else if (!strcmp(argv[0], "-FR")) { free_form = 1; source_form_by_option = 1; } else if (!strcmp(argv[0], "-FI")) { free_form = 0; source_form_by_option = 1; } else if (!strcmp(argv[0], "-ffo")) ; else if (!strcmp(argv[0], "-upcase")) ; else if (!strcmp(argv[0], "-noLimitLine")) ; else if (!strcmp(argv[0], "-uniForm")) ; else if (!strcmp(argv[0], "-noRemote")) ; else if (!strcmp(argv[0], "-lgstd")) ftn_std = 1; //else if (!strcmp(argv[0],"-ta")) // ACC_program= 1; else if (!strcmp(argv[0], "-noH")) ; else if (!strcmp(argv[0], "-C_Cuda")) /*ACC*/ ; else if (!strcmp(argv[0], "-FTN_Cuda") || !strcmp(argv[0], "-F_Cuda")) /*ACC*/ ; else if (!strcmp(argv[0], "-noCudaType")) /*ACC*/ ; else if (!strcmp(argv[0], "-noCuda")) /*ACC*/ ; else if (!strcmp(argv[0], "-noPureFunc")) /*ACC*/ ; else if (!strcmp(argv[0], "-no_blocks_info")) /*ACC*/ ; else if (!strcmp(argv[0], "-noBI")) /*ACC*/ ; else if (!strcmp(argv[0], "-cacheIdx")) /*ACC*/ ; else if (!strcmp(argv[0], "-Ohost")) /*ACC*/ ; else if (!strcmp(argv[0], "-noOhost")) /*ACC*/ ; else if (!strcmp(argv[0], "-Opl2")) /*ACC*/ ; else if (!strcmp(argv[0], "-Opl")) /*ACC*/ ; else if (!strcmp(argv[0], "-oneThread")) /*ACC*/ ; else if (!strcmp(argv[0], "-noTfm")) /*ACC*/ ; else if (!strcmp(argv[0], "-autoTfm")) /*ACC*/ ; else if (!strcmp(argv[0], "-gpuO0")) /*ACC*/ ; else if (!strcmp(argv[0], "-gpuO1")) /*ACC*/ ; else if (!strcmp(argv[0], "-rtc")) /*ACC*/ ; else if ((*argv)[1] == 'H') { if ((*argv)[2] == 's' && (*argv)[3] == 'h' && (*argv)[4] == 'w') { if (!is_integer_value(*argv + 5)) goto ERR; } else if (!strcmp(*argv + 2, "nora")) ; else if (!strcmp(*argv + 2, "oneq")) ; else if (!strcmp(*argv + 2, "onlyl")) ; else goto ERR; } else if (!strcmp(argv[0], "-ver")) { (void)fprintf(stderr, "parser version is \"%s\"\n", VERSION_NUMBER_INT); #ifdef __SPF_BUILT_IN_PARSER return 0; #else exit(0); #endif } #ifdef __SPF else if (!strcmp(argv[0], "-noProject")) noProject = 1; #endif /* else if (!strcmp(argv[0],"-l")) * yylisting = 1; */ else ERR: (void)fprintf(stderr, "Warning 001: unknown option %s is ignored\n", argv[0]); argc--; argv++; } retry: if (*argv) { input_file = *argv; if (output_file) gen_out_name(output_file); else gen_out_name(input_file); } else { /*input_file = "stdin";*/ /*(void)fprintf(stderr,"fdvm: Error: no source file specified\n"); exit (1); */ err_fatal("no source file specified", 3); } if (!source_form_by_option) free_form = SourceFormByName(input_file); if (output_file && !strcmp(input_file, output_file)) err_fatal("Output file has the same name as source file", 334); if (argc > 2) { /* (void)fprintf(stderr,"fdvm: Error: illegal command line format\n"); exit (1); */ err_fatal("illegal command line format", 4); } /* if(perf_analysis && dvm_debug) err_fatal("conflicting options -e and -d"); */ if (HPF_program && HPF) { (void)fprintf(stderr, "Warning: option -hpf%d is ignored\n", HPF_VERSION); HPF = 0; } if (free_form && extend_source) { (void)fprintf(stderr, "Warning: option -extend_source is ignored\n"); extend_source= 0; } language = ForSrc; yylonglines = 1; prflag = 1; cur_file = fi = (PTR_FILE)calloc(1, (unsigned)sizeof(struct file_obj)); fi->lang = language; initialize(); if ((OMP_program == 1) && (dvm_debug > 0)) {/*OMP*/ debug_file = (char *)malloc((unsigned)(strlen(input_file) + 5));/*OMP*/ sprintf(debug_file, "dbg_%s", input_file);/*OMP*/ PrepareSourceFileForDebug(input_file, debug_file); /*OMP*/ make_file_list(input_file);/*OMP*/ if (dbginilex(copys(input_file), copys(debug_file))) { /*OMP*/ err_fatal("Compiler bug (Error in inilex)", 0); /*OMP*/ } /*OMP*/ }/*OMP*/ else { make_file_list(input_file); if (inilex(copys(*argv ? *argv : ""))) { /* (void)printf("Error in inilex\n"); exit(1); */ err_fatal("Compiler bug (Error in inilex)", 0); /*goto finish;*/ } }/*OMP*/ procinit(); if (v_print) { (void)fprintf(stderr, "***** Fortran DVM %s *****\n", COMPILER_VERSION); (void)fprintf(stderr, "\n<<<<< Parsing %s >>>>>\n", input_file); } /* parsing */ if ((k = yyparse())) { /*(void)printf("Bad parse, return code %d\n", k);*/ (void)err("Compiler bug", 0); #ifdef __SPF_BUILT_IN_PARSER release_nodes(); close_files(); return 1; #else exit(1); #endif /*goto finish;*/ } if (parstate != OUTSIDE) { infname = input_file; err("Missing final end statement or unclosed construct", 8); (void)fprintf(stderr, "%d error(s)\n", errcnt); #ifdef __SPF_BUILT_IN_PARSER release_nodes(); close_files(); return 1; #else exit(1); #endif /*goto finish;*/ } global_bfnd->filename = head_file; /*podd 18.04.99*/ /*global_bfnd->filename = cur_thread_file;*/ /*podd 18.04.99*/ if (errcnt) { (void)fprintf(stderr, "%d error(s)\n", errcnt); #ifdef __SPF_BUILT_IN_PARSER release_nodes(); close_files(); return 1; #else exit(1); #endif if (fromfile) { int ans; (void)printf("Do you want to invoke editor? [y/n] "); while ((ans = getchar()) == '\n'); if (ans == 'y' || ans == 'Y') { char *edtcmd; char cmd[50]; edtcmd = getenv("FOREDIT"); if (!edtcmd) edtcmd = defeditor; (void)sprintf(cmd, edtcmd, errline, *argv); (void)system(cmd); release_nodes(); close_files(); goto retry; } #ifdef __SPF_BUILT_IN_PARSER release_nodes(); close_files(); return 1; #else exit(1); #endif } } /* if (dep) { (void)build_sets(0, global_bfnd,NULL,NULL,1); (void)build_sets(0, global_bfnd,NULL,NULL,2); (void)gendeps(global_bfnd); (void)relink(fi); printf("garbage collecting\n"); if (garb_collect) (void)collect_garbage(fi); } */ if (yylisting) (void)fprintf(outf, "%s\n", input_file); if (!global_bfnd->thread) /*null program (only global_bfnd is)*/ { err_fatal("null program", 7); } #ifndef __SPF_BUILT_IN_PARSER if (HPF) { FILE *hpfout; if (no <= 1) output_file = outname; if ((hpfout = fopen(output_file, "w")) == NULL) { /* (void) fprintf(stderr,"Can't open file %s for write\n",output_file);*/ /*UnparseFDVMProgram(stdout,cur_file);*/ /* exit(1);*/ errstr_fatal("Can't open file %s for write", output_file, 6); } else { if (v_print) (void)fprintf(stderr, "\n<<<<< Generating HPF program %s >>>>>\n", output_file); errcnt = UnparseFDVMProgram(hpfout, cur_file); (void)fclose(hpfout); if (errcnt) { (void)fprintf(stderr, "%d error(s)\n", errcnt); exit(1); } else if (v_print) (void)fprintf(stderr, "\n***** Done *****\n"); exit(0); } } #else if (HPF) return -1; #endif write_nodes(cur_file, outname); #ifdef __SPF if (noProject == 0) #endif { fproj = ad ? fopen(proj_name, "a") : fopen(proj_name, "w"); if (fproj == NULL) { /* (void) fprintf(stderr,"Can't open file %s for write\n",proj_name); exit(1); */ errstr_fatal("Can't open file %s for write", proj_name, 6); } (void)fprintf(fproj, "%s\n", outname); (void)fclose(fproj); } /* finish:*/ return 0; } void clf(p) FILEP *p; { void fatal(); if (p && *p && *p != stdout) { if (ferror(*p)) fatal("writing error", 329); (void)fclose(*p); } *p = (FILEP)NULL; } void make_file_list(filename) char *filename; { char *namep = (char *) malloc((unsigned)(strlen(filename)+1)); PTR_FNAME this = (PTR_FNAME) malloc((unsigned)sizeof(struct file_name)); PTR_FNAME p; (void)strcpy(namep, filename); this->id = fi->num_files = ++num_files; this->name = namep; this->next = (PTR_FNAME)NULL; if (head_file == (PTR_FNAME)NULL) fi->head_file = head_file = this; else { for (p = head_file; p->next != NULL; p = p->next) ; p->next = this; } cur_thread_file = this; } void PrepareSourceFileForDebug (input_file, debug_file) /*OMP*/ char *input_file; /*OMP*/ char *debug_file; /*OMP*/ { /*OMP*/ FILE * pFile; long lSize; char sInclude[] = "\r\n include 'dbg_init.h'"; /*int count = 0;*/ char * buffer; size_t result; pFile = fopen ("dbg_init.h", "r"); if (pFile==NULL) { pFile = fopen ("dbg_init.h", "w"); fprintf (pFile, " subroutine DBG_Init_Handles ()\n"); fprintf (pFile, " include 'dbg_vars.h'\n"); fprintf (pFile, " end subroutine DBG_Init_Handles"); } fclose (pFile); pFile = fopen ("dbg_vars.h", "r"); if (pFile==NULL) { pFile = fopen ("dbg_vars.h", "w"); fprintf (pFile, " dimension idyn_mp(1)\n"); fprintf (pFile, " dimension istat_mp(1)\n"); fprintf (pFile, " common /DBG_STAT/ istat_mp\n"); fprintf (pFile, " common /DBG_DYN/ idyn_mp\n"); fprintf (pFile, "C$OMP THREADPRIVATE (/DBG_DYN/)\n"); fprintf (pFile, " common /DBG_THREAD/ ithreadid\n"); fprintf (pFile, "C$OMP THREADPRIVATE (/DBG_THREAD/)"); } fclose (pFile); pFile = fopen (input_file, "rb" ); if (pFile==NULL) {return;} /* obtain file size:*/ fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); /* allocate memory to contain the whole file:*/ buffer = (char*) malloc (sizeof(char)*(lSize + sizeof(sInclude))); if (buffer == NULL) {fprintf (stderr, "PrepareSourceFileForDebug: not engough memory!\n"); exit (1);} /* copy the file into the buffer:*/ result = fread (buffer,1,lSize,pFile); /* the whole file is now loaded in the memory buffer. */ fclose (pFile); pFile = fopen (debug_file, "wb" ); if (pFile==NULL) {fprintf (stderr, "PrepareSourceFileForDebug: can not open %s file!\n", debug_file); exit (1);} strcpy (buffer+lSize, sInclude); result = fwrite (buffer,1,lSize + sizeof(sInclude),pFile); fclose (pFile); free (buffer); } /*OMP*/ int DoDebugInclude (char *fname) {/*OMP*/ FILE * pFile; long lSize; int count = 0; char * buffer; char * beg = NULL; size_t result; pFile = fopen (fname, "rb" ); if (pFile==NULL) {return 0;} /* obtain file size:*/ fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); /* allocate memory to contain the whole file:*/ buffer = (char*) malloc (sizeof(char)*lSize); if (buffer == NULL) {fprintf (stderr, "DoDebugInclude: not engough memory!\n"); exit (1);} /* copy the file into the buffer:*/ result = fread (buffer,1,lSize,pFile); /* the whole file is now loaded in the memory buffer. */ fclose (pFile); beg = buffer; while (beg != NULL) { beg = strstr (beg, "call DBG_Get_Handle"); if (beg != NULL) { beg++; count++; } } free (buffer); fprintf (stderr, "%d",count); return count; }