📄 preprocessor.c.olf
字号:
#include"gas51.h"#include<string.h>#define IS_NOT_DEFINED 0#define IS_DEFINED 1char dest[80];char tmpnambuff[12]="gas51XXXXXX";//gas51_define_list head ;//head.next = NULL ;//void insert_into_define_list(char *,char *, int);void gas51_perror();char * include_file(char *arg,char *file,long pos);int pat_index(char *,char *);char * remove_all_spaces(char *);int preprocess(char *file_to_preprocess) //function to prprocess the assembly file...{ FILE *fp,newfp; char buff[80]={0},line[80],tempbuff[40]; char *buff_cleaned,newfilebuff[20],*newfile; char directive_arg[15],directive_expansion[15],directive_name[15],directive_symbol[15] ; int i,j,l; newfile=newfilebuff; fp=fopen(file_to_preprocess,"r"); //perror("fopen"); gas51_line_no = 0; //strcpy(tempbuff,gas51_file_being_assembled); //strcat(tempbuff,".pp1"); //fpdest=fopen(tempbuff,"w"); strcpy(newfilebuff,gas51_file_being_assembled); while( fgets(buff,80,fp) ) { //puts(buff); gas51_line_no++; for(i=0;i<=strlen(buff);i++) { if(buff[i]==';') break; } buff[i]='\0' ; if(pat_index(buff,"#include")) /****EXTREMELY IMPORTANT!!! there must be NO SPACE BETWEEN the '#' and 'include' ...**/ { buff_cleaned = remove_all_spaces(buff) ; /*sscanf(buff,"%s %s %s",directive_name,directive_parm,directive_arg); puts(directive_name); puts(directive_parm); puts(directive_arg); */ for(i=9,j=0;i<=strlen(buff_cleaned);i++,j++) // in this case filename starts from 10th location or 9th index... directive_arg[j]=buff_cleaned[i] ; directive_arg[strlen(directive_arg)-1] = '\0' ; //to replace the last '>' with NULL... include_file(directive_arg,newfile,ftell(fp)); fclose(fp); fp=fopen(tmpnambuff,"r"); //fclose(fp); //fp=newfp; //rewind(fp); } else if(pat_index(buff,"#define")) /****EXTREMELY IMPORTANT!!! there must be NO SPACE BETWEEN the '#' and 'define' ...**/ { //buff_cleaned = remove_all_spaces(buff) ; //for(i=7,j=0;i<=strlen(buff_cleaned);i++,j++) // in this case filename starts from 10th location or 9th index... //directive_arg[j]=buff_cleaned[i] ; //directive_arg[strlen(directive_arg)-1] = '\0' ; //to replace the last '>' with NULL... //sscanf(buff,"%s %s %s",directive_name,directive_symbol,directive_expansion); /*puts(directive_name); puts(directive_parm); puts(directive_arg); */ //insert_into_define_list(directive_symbol,directive_expansion,IS_DEFINED); } } //line_splice(" //print_all_defines(); //fclose(fpdest); }int pat_index(char *src_str,char *substr){ int i=0,j=0,k=0,retval=0; int len_substr , len_src_str ; char temp_str[10]; len_substr = strlen(substr) ; len_src_str = strlen(src_str) ; for(i=0;i<(len_src_str - len_substr);i++) { for(j=0,k=i;k<i+len_substr;j++,k++) { temp_str[j]=src_str[k] ; } temp_str[j] = '\0' ; if(!strcmp(temp_str,substr)) { retval=i+1; //we have to increment i here coz arrays start with 0 but column no. in break; //a file starts with 1... } else retval=0; } return retval;}char * include_file(char *file_to_include,char *newfile, long pos){ FILE *fpsrc,*fptemp,*fpdest; int i=0,newfd; char *fname1, *fname2 ,buff[80] ,tempbuff[40];//tempnambuff[12]="gas51XXXXXX"; char *retptr; char const1[]="/usr/include/gas51/" ; //extern int gas51_sys_errlist[100]; char const2[]="./" ; fname1=strcat(const1 ,file_to_include) ; fname2=strcat(const2 ,file_to_include) ; // fptemp points to .asm file, fpdest points to .asm.tmp file, if ( ((fpsrc=fopen(fname1 ,"r")) ) || ( (fpsrc=fopen(fname2,"r")) )) { // code to include file contents goes here... fptemp=fopen(newfile,"r"); newfd=mkstemp(tmpnambuff); retptr=tmpnambuff; //newname = tmpnam(tempbuff); //strcpy(tempbuff,newfile); //strcat(tempbuff,".tmp"); //fpdest=fopen(tempbuff,"w"); fpdest=fdopen(newfd,"w"); while(1) { fgets(buff,80,fptemp) ; if( (ftell(fptemp)) == pos ) break; else fprintf(fpdest,"%s",buff); } //fseek(fptemp,pos,SEEK_SET); while( fgets(buff,80,fpsrc) ) { fprintf(fpdest,"%s",buff); } fseek(fptemp,pos,SEEK_SET); while( fgets(buff,80,fptemp) ) { fprintf(fpdest,"%s",buff); } fclose(fpsrc); fclose(fpdest); fclose(fptemp); return retptr; } else { gas51_errno = 0 ; // 0 -> code for file not found!! gas51_perror() ; exit(0) ; } }char * remove_all_spaces(char *buff_to_clean){ int i,j,k; static char cleaned_buff[80]; for(i=0,j=0;i<strlen(buff_to_clean);i++) { if(buff_to_clean[i]!=' ' && buff_to_clean[i]!='\t' && buff_to_clean[i]!='\n' && buff_to_clean[i]!='\r' ) { cleaned_buff[j] = buff_to_clean[i]; j++; } else continue; } cleaned_buff[j]= '\0' ; return cleaned_buff ;} void gas51_perror(){ printf("gas51: %s : %d : %s \n", gas51_file_being_assembled, gas51_line_no, gas51_errlist[gas51_errno]);}//void insert_into_define_list(char *Directive_Symbol, char *Directive_Expansion , int flag )//{// gas51_define_list *tempStruct,*tempPtr; /* forming the define structure prior to insertion into the linked list...*/ /* tempStruct = (gas51_define_list *)malloc(sizeof(gas51_define_list)) ; tempStruct->symbol = Directive_Symbol ; tempStruct->expansion = Directive_Expansion ; tempStruct->flag = IS_DEFINED ; tempStruct->next = NULL ; tempPtr = &head ; while(tempPtr->next) { tempPtr = tempPtr->next ; } tempPtr = tempStruct ; head.next = tempPtr ; }*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -