📄 project.c
字号:
#endif READ_NUM(" entries",numentries); /* Get no. of entry points */ NEXTLINE;#ifdef DEBUG_PROJECT printf("read entries %d\n",numentries);#endif /* Read defn arglists */ for(ientry=0; ientry<numentries; ientry++) { proj_arg_info_in(fd,topfilename,TRUE); } NEXTLINE; READ_NUM(" externals",numexts); /* Get no. of external refs */#ifdef DEBUG_PROJECT printf("read exts %d\n",numexts);#endif NEXTLINE; /* Read invocation & ext def arglists */ for(iext=0; iext<numexts; iext++) { proj_arg_info_in(fd,topfilename,FALSE); } NEXTLINE; /* Read common block info */ READ_NUM(" comblocks",numblocks);#ifdef DEBUG_PROJECT printf("read num blocks %d\n",numblocks);#endif NEXTLINE; for(iblock=0; iblock<numblocks; iblock++) { proj_com_info_in(fd,topfilename); } NEXTLINE; }/* end while(retval == 1) */ if(retval != EOF) READ_ERROR; init_symtab(); /* Clear out local strspace */}static char *prev_file_name="";/* used to reduce number of callocs */ /* Read arglist info */PRIVATE voidproj_arg_info_in(fd,filename,is_defn) FILE *fd; char *filename; /* name of toplevel file */ int is_defn; { char id_name[MAXNAME+1],module_name[MAXNAME+1],sentinel[6]; char file_name[MAXNAME+1]; int id_class,id_type; long id_size; unsigned id_used_flag, id_set_flag, id_invoked, id_declared, id_library_module, future1,future2,future3; unsigned h; Gsymtab *gsymt, *module; unsigned alist_class,alist_type,alist_is_defn,alist_is_call, alist_external_decl,alist_actual_arg; unsigned alist_line; long alist_size; unsigned numargs,iarg,arg_num,arg_class,arg_type,arg_dims; unsigned long arg_elts; long arg_size; unsigned /* Flags for arguments */ arg_is_lvalue, arg_set_flag, arg_assigned_flag, arg_used_before_set, arg_array_var, arg_array_element, arg_declared_external, arg_future_flag; /* possible flag for future use */ if(is_defn) READ_STR(" entry",id_name); /* Entry point name */ else READ_STR(" external",id_name); /* External name */ READ_NUM(" class",id_class); /* class as in symtab */ READ_NUM(" type",id_type); /* type as in symtab */ READ_LONG(" size",id_size); /* size as in symtab */ if(fscanf(fd," flags %d %d %d %d %d %d %d %d", &id_used_flag, &id_set_flag, &id_invoked, &id_declared, &id_library_module, &future1,&future2,&future3) != 8) READ_ERROR; NEXTLINE;#ifdef DEBUG_PROJECT printf("read id name %s class %d type %d\n",id_name,id_class,id_type);#endif /* Create global symtab entry */ h = hash_lookup(id_name); if( (gsymt = hashtab[h].glob_symtab) == NULL) { gsymt = install_global(h,id_type,class_SUBPROGRAM); gsymt->size = id_size; } else if(is_defn) gsymt->size = id_size; /* Set library_module flag if project file was created with -lib mode in effect, or is now taken in -lib mode */ if(is_defn && (library_mode || id_library_module)) { gsymt->library_module = TRUE; } if(id_used_flag) gsymt->used_flag = TRUE; if(id_set_flag) gsymt->set_flag = TRUE; if(id_invoked) gsymt->invoked_as_func = TRUE; if(id_declared) gsymt->declared_external = TRUE; while( fscanf(fd,"%5s",sentinel),#ifdef DEBUG_PROJECT printf("sentinel=[%s]\n",sentinel),#endif strcmp(sentinel,(is_defn?"defn":"call")) == 0) { ArgListHeader *ahead; ArgListElement *alist; NEXTLINE; READ_STR(" module",module_name); READ_STR(" file",file_name); READ_NUM(" line",alist_line); /* line number */ READ_NUM(" class",alist_class); /* class as in ArgListHeader */ READ_NUM(" type",alist_type); /* type as in ArgListHeader */ READ_LONG(" size",alist_size); /* size as in ArgListHeader */ if(fscanf(fd," flags %d %d %d %d", &alist_is_defn, &alist_is_call, &alist_external_decl, &alist_actual_arg) != 4) READ_ERROR; NEXTLINE;#ifdef DEBUG_PROJECT printf("read alist class %d type %d line %d\n",alist_class,alist_type,alist_line);#endif /* Find current module in symtab. If not there, make a global symtab entry for it. It will be filled in eventually when processing corresponding entry. */ h = hash_lookup(module_name); if( (module = hashtab[h].glob_symtab) == NULL) { module = install_global(h,type_UNDECL,class_SUBPROGRAM); } if(module->internal_entry) { warning(NO_LINE_NUM,NO_COL_NUM, "entry point redefined as module"); msg_tail(module->name); msg_tail(": redefinition ignored"); } else { if(is_defn) { if(module != gsymt) {#ifdef DEBUG_PROJECT printf("\nLinking entry %s to module %s", gsymt->name,module->name);#endif gsymt->internal_entry = TRUE; gsymt->link.module=module; /* interior entry: link it to module */ } } else { /* call: add to child list */ /* Avoid duplication on child list. It will have just been placed there on previous project-file entry, so it will be the first child on the list. */#ifdef DEBUG_PROJECT printf("\nChild %s of module %s", gsymt->name,module->name);#endif if(module->link.child_list == NULL || module->link.child_list->child != gsymt) { ChildList *node= (ChildList *)SN_calloc(1,sizeof(ChildList));#ifdef DEBUG_PROJECT printf(" linked in");#endif node->child = gsymt; node->next = module->link.child_list; module->link.child_list = node; }#ifdef DEBUG_PROJECT else { printf(" (duplicate)"); }#endif } } if(alist_is_defn || alist_is_call) { READ_NUM(" args",numargs); NEXTLINE; } else numargs = 0;#ifdef DEBUG_PROJECT printf("read numargs %d\n",numargs);#endif/*** if(!is_defn) {** gsymt->used_flag = TRUE;** }*/ /* Create arglist structure */ if(((ahead=(ArgListHeader *) SN_calloc(1, sizeof(ArgListHeader))) == (ArgListHeader *) NULL) || (numargs != 0 && ((alist=(ArgListElement *) SN_calloc(numargs,sizeof(ArgListElement))) == (ArgListElement *) NULL))){ oops_message(OOPS_FATAL,proj_line_num,NO_COL_NUM, "out of malloc space for argument list"); } /* Initialize arglist and link it to symtab */ ahead->type = type_byte(alist_class,alist_type); ahead->size = alist_size; ahead->numargs = numargs; ahead->arg_array = (numargs==0? NULL: alist); ahead->module = module; ahead->topfile = filename; /* try to avoid reallocating space for same name */ ahead->filename = (strcmp(file_name,filename)==0? filename: (strcmp(file_name,prev_file_name)==0? prev_file_name: (prev_file_name=strcpy(ckalloc(strlen(file_name)+1),file_name)))); ahead->line_num = alist_line; ahead->is_defn = alist_is_defn; ahead->is_call = alist_is_call; ahead->external_decl = alist_external_decl; ahead->actual_arg = alist_actual_arg; ahead->next = gsymt->info.arglist; gsymt->info.arglist = ahead; /* Fill arglist array from project file */ for(iarg=0; iarg<numargs; iarg++) { READ_NUM(" arg",arg_num); if(arg_num != iarg+1) READ_ERROR; READ_NUM(" class",arg_class); READ_NUM(" type",arg_type); READ_LONG(" size",arg_size); READ_NUM(" dims",arg_dims); READ_LONG(" elts",arg_elts); if(fscanf(fd," flags %d %d %d %d %d %d %d %d", &arg_is_lvalue, &arg_set_flag, &arg_assigned_flag, &arg_used_before_set, &arg_array_var, &arg_array_element, &arg_declared_external, &arg_future_flag) != 8) READ_ERROR; alist[iarg].info.array_dim = array_dim_info(arg_dims,arg_elts); alist[iarg].type = type_byte(arg_class,arg_type); alist[iarg].size = arg_size; alist[iarg].is_lvalue = arg_is_lvalue; alist[iarg].set_flag = arg_set_flag; alist[iarg].assigned_flag = arg_assigned_flag; alist[iarg].used_before_set = arg_used_before_set; alist[iarg].array_var = arg_array_var; alist[iarg].array_element = arg_array_element; alist[iarg].declared_external = arg_declared_external; NEXTLINE;#ifdef DEBUG_PROJECT printf("read arg num %d\n",arg_num);#endif } }/* end while( sentinel == "defn"|"call") */ if(strcmp(sentinel,"end") != 0) READ_ERROR; NEXTLINE;}PRIVATE voidproj_com_info_in(fd,filename) FILE *fd; char *filename;{ char id_name[MAXNAME+1],module_name[MAXNAME+1]; char file_name[MAXNAME+1]; unsigned id_class,id_type; unsigned /* Flags in ComListHeader */ clist_any_used, clist_any_set, clist_saved, clist_future; unsigned clist_line; unsigned numvars,ivar,var_num,var_class,var_type,var_dims; unsigned long var_elts; unsigned /* Flags for common variables */ var_used, var_set, var_used_before_set, var_assigned, var_future_4, var_future_3, var_future_2, var_future_1; long var_size; int h; Gsymtab *gsymt, *module; ComListHeader *chead; ComListElement *clist; READ_STR(" block",id_name); READ_NUM(" class",id_class); READ_NUM(" type",id_type);#ifdef DEBUG_PROJECT printf("read com name %s class %d type %d\n",id_name,id_class,id_type);#endif NEXTLINE; READ_STR(" module",module_name); READ_STR(" file",file_name); READ_NUM(" line",clist_line); if(fscanf(fd," flags %d %d %d %d", &clist_any_used, &clist_any_set, &clist_saved, &clist_future) != 4) READ_ERROR; NEXTLINE; READ_NUM(" vars",numvars);#ifdef DEBUG_PROJECT printf("read flags %d %d %d %d line %d\n", clist_any_used, clist_any_set, clist_saved, clist_future, clist_line);#endif NEXTLINE; /* Create global symtab entry */ h = hash_lookup(id_name); if( (gsymt = hashtab[h].com_glob_symtab) == NULL) gsymt = install_global(h,id_type,id_class); /* Create arglist structure */ if(((chead=(ComListHeader *) SN_calloc(1, sizeof(ComListHeader))) == (ComListHeader *) NULL) || (numvars != 0 && ((clist=(ComListElement *) SN_calloc(numvars,sizeof(ComListElement))) == (ComListElement *) NULL))){ oops_message(OOPS_FATAL,proj_line_num,NO_COL_NUM, "out of malloc space for common list"); } /* Find current module in symtab. If not there, make a global symtab entry for it. This is bogus, since all modules should have been defined previously. */ h = hash_lookup(module_name); if( (module = hashtab[h].glob_symtab) == NULL) { fprintf(stderr,"\nWarning-- something's bogus in project file\n"); module = install_global(h,type_UNDECL,class_SUBPROGRAM); } /* Initialize arglist and link it to symtab */ chead->numargs = numvars; chead->line_num = clist_line; chead->com_list_array = (numvars==0? NULL: clist); chead->module = module; chead->topfile = filename; chead->any_used = clist_any_used; chead->any_set = clist_any_set; chead->saved = clist_saved; /* try to avoid reallocating space for same name */ chead->filename = (strcmp(file_name,filename)==0? filename: (strcmp(file_name,prev_file_name)==0? prev_file_name: (prev_file_name=strcpy(ckalloc(strlen(file_name)+1),file_name)))); chead->next = gsymt->info.comlist; gsymt->info.comlist = chead; /* Fill comlist array from project file */ for(ivar=0; ivar<numvars; ivar++) { READ_NUM(" var",var_num); if(var_num != ivar+1) READ_ERROR; READ_NUM(" class",var_class); READ_NUM(" type",var_type); READ_LONG(" size",var_size); READ_NUM(" dims",var_dims); READ_LONG(" elts",var_elts); if(fscanf(fd," flags %d %d %d %d %d %d %d %d", &var_used, &var_set, &var_used_before_set, &var_assigned, &var_future_4, &var_future_3, &var_future_2, &var_future_1) != 8) READ_ERROR; NEXTLINE;#ifdef DEBUG_PROJECT printf("read class %d type %d dims %d size %d\n",var_class,var_type,var_dims,var_size);#endif clist[ivar].dimen_info = array_dim_info(var_dims,var_elts); clist[ivar].type = type_byte(var_class,var_type); clist[ivar].size = var_size; clist[ivar].used = var_used; clist[ivar].set = var_set; clist[ivar].used_before_set = var_used_before_set; clist[ivar].assigned = var_assigned; }}/*proj_com_info_in*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -