⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
📖 第 1 页 / 共 2 页
字号:
}#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 + -