📄 misc.c
字号:
}#endif/************************************************************** Strcpy(d,s)* a safe version of strcpy*/Strcpy(d,s)Str *d;char *s;{int newlen;newlen = strlen(s)+1;if (newlen > d->max) { if (d->str) free(d->str); d->str = malloc(newlen*2); d->max = newlen*2; }strcpy(d->str,s);}/**************************************************************/Strlen(Str *s){if (s->str == 0) return(0);return(strlen(s->str));}/************************************************************** char *getStrn(Str *s,int n)* return the 'n' word from the Str s.*/char *getStrn(s,n)Str *s;int n;{char *p,*b,*e;int len;#if 0printf("getStr(%08x,%d) max=%d str=%08x\n",s,n,s->max,s->str);printf("str=[%s]\n",s->str);#endif/* discard leading whitespace *//* find 1st non-white */for (b=s->str;isspace(*b);b++) ;for (;n>0;n--) { /* find 1st white */ for (;!isspace(*b) && *b;b++) ; /* find 1st non-white */ for (;isspace(*b);b++) ; }/* we have now found the start of the word *//* now find the end of the word *//* find 1st white */for (e=b;!isspace(*e) && *e;e++) ;len = e-b;p = (char *)malloc(len+1);strNcpy(p,b,len);return(p);}/************************************************************** Strcat(d,s)* a safe version of strcat*/Strcat(d,s)Str *d;char *s;{int newlen;char *t;if (d->str) newlen = strlen(d->str)+strlen(s)+1;else newlen = strlen(s)+1;if (newlen > d->max) { t = malloc(newlen*2); if (d->str) { strcpy(t,d->str); free(d->str); } else *t = 0; d->str = t; d->max = newlen*2; }strcat(d->str,s);}typedef struct DefHdr { struct DefHdr *next; char *name; char *value; } DefHdr;DefHdr *defChn;/************************************************************** readDefs(fname)*/readDefs(fname)char *fname;{char *p;char lnbuf[LNMAX];DefHdr *q;FILE *fp;fp = fopen(fname,"r");if (!fp) { fprintf(stderr,"%s: File not found\n",fname); Exit(1); }while (fgets(lnbuf,LNMAX,fp)) { if (strncmp(lnbuf,"#define",7)) continue; chop(lnbuf); /* remove trailing \n */ q = (DefHdr *)malloc(sizeof(DefHdr)+strlen(lnbuf)); strcpy(q+1,lnbuf); p=((char *)(q+1))+7; /* start just after the #define */ for (;isspace(*p);p++) ; /* skip spaces */ q->name = p; /* start of 'name' */ for (;!isspace(*p) && *p;p++) ; /* find endofword */ *p++ = 0; /* end of 'name' */ for (;isspace(*p);p++) ; /* skip spaces */ if (*p == '"') { p++; q->value = p; for (;*p != '"' && *p;p++) ; /* find matching dblquote */ if (*p == '"') strdchr(p); } else q->value = p; q->next = defChn; defChn = q; }fclose(fp);}/************************************************************** char *getDef(name)*/char *getDef(name)char *name;{DefHdr *q;for (q=defChn; q; q=q->next) { if (strequ(name,q->name)) return(q->value); }return(0);}/************************************************************** chop(p)* chop the trailing \n off the line*/chop(p)char *p;{int len;len = strlen(p);if (len < 1) return;if (p[len-1] == '\n') p[len-1] = 0;}/************************************************************** process_file(char *arg)* Assume that lines have no leading whitespace* Argument pairs must be on the same line. eg -T address* Blank lines are ok* Lines with '#' in column 1 are ignored*/process_file(arg)char *arg;{int i,ac,lncnt,maxac;char *p,**av,*freelist,buf[MAXLN];FILE *ifp;if (strequ(arg,"-f-")) { ifp = stdin; fgets(buf,MAXLN,ifp); ac = argvize(&av[1],buf); getargs(ac+1,av); return; }ifp = fopen(&arg[2],"r");if (ifp == 0) { fprintf(stderr,"can't open %s\n",&arg[2]); Exit(1); }maxac = lncnt = 0;while (fgets(buf,MAXLN,ifp)) { if (*buf == '#') continue; chomp(buf); maxac += argvize(0,buf); lncnt++; }rewind(ifp);av = (char **)malloc(sizeof(char *)*(maxac+1));freelist = (char *)malloc(sizeof(char *)*lncnt);ac = 1;lncnt = 0;while (fgets(buf,MAXLN,ifp)) { if (*buf == '#') continue; chomp(buf); p = strdup(buf); freelist[lncnt++] = p; ac = argvize(&av[ac],p) + ac; }fclose(ifp);getargs(ac,av);for (i=0;i<lncnt;i++) if (freelist[i]) free(freelist[i]);}/************************************************************** chomp(p)* Remove trailing all EOL chars. Useful for lines read with fgets().*/chomp(p)char *p;{int n;n = strlen(p);while (n > 0) { if (!(p[n-1] == '\n' || p[n-1] == '\r')) break; n--; }p[n] = 0;}/************************************************************** addcrt0(char *fmt,char *lsipkg,char *endian,char *gnum)*/addcrt0(char *fmt,char *lsipkg,char *endian,char *gnum){char *vtmp;int sz;sz = strlen(fmt)+strlen(lsipkg)+strlen(endian);if (gnum) sz += strlen(gnum);vtmp = (char *)malloc(sz);sprintf(vtmp,fmt,lsipkg,endian,gnum);addarg(&crt0,vtmp);free(vtmp);}/************************************************************** int do_board(char *board)* If you add a board, don't forget to update the "types" list* at the bottom of this function.* If you change dstart, you must also edit the corresponding* lib/iaXXXX.s file.*/int do_board(char *board){char *ts,*fmt;if (striequ(board,"bdmr4101")) { stdcrt0 = 0; if (prom) { addcrt0("%s/lib/%so/k4101a.o",LSIPKG,ENDIAN,0); addcrt0("%s/lib/%so/ia4101-rom.o",LSIPKG,ENDIAN,0); ts = "9fc00000"; dstart = "80000300"; } else { addcrt0("%s/lib/%so/ia4101.o",LSIPKG,ENDIAN,0); ts = "80000300"; } addcrt0("%s/lib/%so/ic4101.o",LSIPKG,ENDIAN,0); addarg(&cflags,"-DBDMR4101"); addarg(&ppflags,"-DBDMR4101"); }else if (striequ(board,"bdmr4011")) { stdcrt0 = 0; if (mips4k) { if (prom) { addcrt0("%s/lib/%so/k4011a-4k.o",LSIPKG,ENDIAN,0); addcrt0("%s/lib/%so/ia4011-4k-rom.o",LSIPKG,ENDIAN,0); } else { addcrt0("%s/lib/%so/ia4011-4k.o",LSIPKG,ENDIAN,0); } addcrt0("%s/lib/%so/ic4011-4k.o",LSIPKG,ENDIAN,0); } else { if (prom) { addcrt0("%s/lib/%so/k4011a.o",LSIPKG,ENDIAN,0); addcrt0("%s/lib/%so/ia4011-rom.o",LSIPKG,ENDIAN,0); } else { addcrt0("%s/lib/%so/ia4011.o",LSIPKG,ENDIAN,0); } addcrt0("%s/lib/%so/ic4011.o",LSIPKG,ENDIAN,0); } if (prom) {ts = "9fc00000"; dstart = "80000400";} else ts = "80000400"; addarg(&cflags,"-DBDMR4011"); addarg(&ppflags,"-DBDMR4011"); }else if (striequ(board,"bdmr4102")) { stdcrt0 = 0; if (prom) { addcrt0("%s/lib/%so/k4102a.o",LSIPKG,ENDIAN,0); addcrt0("%s/lib/%so/ia4102-rom.o",LSIPKG,ENDIAN,0); ts = "9fc00000"; dstart = "80000300"; } else { addcrt0("%s/lib/%so/ia4102.o",LSIPKG,ENDIAN,0); ts = "80000300"; } addcrt0("%s/lib/%so/ic4102.o",LSIPKG,ENDIAN,0); addarg(&cflags,"-DBDMR4102"); addarg(&ppflags,"-DBDMR4102"); }else if (striequ(board,"pmon")) return(1); /* fake board type */else { printf("%s: unknown board type.\n",board); printf("types: bdmr4101 bdmr4011 bdmr4102.\n"); return(0); }strcpy(tstart,ts);return(1);}/**************************************************************/getStdArgs(int argc,char *argv[],int *ip){int i,ac;char *p,*fmt,buf[MAXLN];Str *f;FILE *ifp;i = *ip;if (strequ(argv[i],"-fast")) fast = 1;else if (strequ(argv[i],"-driver")) { driver = 1; syms = 0; stdcrt0 = "%s/lib/%sg/crt3.o"; }else if (strequ(argv[i],"-board")) { i++; if (i >= argc || argv[i][0] == '-') { printf("-board: boardtype missing.\n"); Exit(1); } if (!do_board(argv[i])) Exit(1); }else if (strequ(argv[i],"-xflash")) { if (stdcrt0) addcrt0("%s/lib/%sg/crt2.o",LSIPKG,ENDIAN,0); stdcrt0 = 0; addcrt0("%s/lib/%so/xflash.o",LSIPKG,ENDIAN,0); }else if (strequ(argv[i],"-prom")) { prom = 1; fast = 0; }else if (strequ(argv[i],"-crt0")) { stdcrt0 = 0; }else if (strequ(argv[i],"-T")) { i++; strcpy(tstart,argv[i]); }else if (strequ(argv[i],"-D")) { i++; dstart = argv[i]; }else if (strequ(argv[i],"-target")) i++;else if (strequ(argv[i],"-L")) { Strcpy(&llist,""); initial_lc = ""; }else if (!strncmp(argv[i],"-L",2)) { addarg(&llist,argv[i]); }else if (!strncmp(argv[i],"-D",2) && strlen(argv[i]) > 2) { addarg(&cflags,argv[i]); addarg(&ppflags,argv[i]); }else if (strequ(argv[i],"-I")) { Strcpy(&ilist,""); }else if (!strncmp(argv[i],"-I",2)) { addarg(&flags,argv[i]); }else if (strequ(argv[i],"-c")) { stoppoint = 'c'; addarg(&cflags,argv[i]); }else if (strequ(argv[i],"-S")) { stoppoint = 'S'; addarg(&cflags,argv[i]); }else if (strequ(argv[i],"-v")) vflag = 1;else if (strequ(argv[i],"-srec")) fast = 0;else if (strequ(argv[i],"-chksum")) chksum = "-c";else if (strequ(argv[i],"-syms")) syms = 0;else if (strequ(argv[i],"-ssyms")) { syms = 0; ssyms_flag = 1; }else if (!strncmp(argv[i],"-W",2)) { for (p=argv[i];*p;p++) if (*p == ',') *p = ' '; switch (argv[i][2]) { case 'c' : f = &cflags; break; case 'a' : f = &asflags; break; case 'l' : f = &ldflags; break; } addarg(f,&argv[i][3]); }else if (!strncmp(argv[i],"-f",2)) process_file(argv[i]);else if (strequ(argv[i],"-EB")) ENDIAN = "b";else if (strequ(argv[i],"-EL")) ENDIAN = "l";else if (strequ(argv[i],"-o")) { i++; ofile = argv[i]; }else if (!strncmp(argv[i],"-l",2)) { sprintf(tmp,"-l%s",&argv[i][2]); addarg(&LIBS,tmp); }else if (!strncmp(argv[i],"-O",2)) addarg(&cflags,argv[i]);else if (strequ(argv[i],"-g")) addarg(&flags,argv[i]);else if (strequ(argv[i],"-double")) SZ = 1;else if (strequ(argv[i],"-lm")) { fprintf(stderr,"-lm Not supported by this toolset\n"); Exit(1); }else return(0);*ip = i;return(1);}/************************************************************** int striequ(s1,s2) * returns 1 if s1 matches s2 ignoring case, else 0 */int striequ(s1,s2)char *s1,*s2;{if (!s1 || !s2) return(0);for (;*s1;s1++,s2++) { if (toupper(*s1) != toupper(*s2)) return(0); }if (*s2) return(0);return(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -