📄 set.c
字号:
/************************************************************* * File: mon/set.c * Purpose: Part of core Monitor * Author: Phil Bunce (pjb@carmel.com) * Revision History: * 970304 Start of revision history * 970409 Switched over to using addEnvRec * 970827 Fixed prob w "set foo". * 970820 Added value = 0 to addEnvRec. Needed for IMON. Symptom * was bad ether downld to target. * 980715 Modified set_nvram() to write p2 marker. */#include <string.h>#include <mon.h>struct EnvRec monenvs[] = { {"brkcmd","l @pc 1"}, {"datasz","-b","-b -h -w"}, {"inalpha","hex","hex symbol"}, {"inbase","16","auto 8 10 16"}, {"moresz","10"}, {"regstyle","sw","hw sw"}, {"rptcmd","trace","off on trace"}, {"trabort","^K"}, {"uleof","%"}, {"ulcr","off","off on"}, {"validpc","_ftext etext"}, {0}};EnvRec *envChain;FILE *dfp;int verbose;/************************************************************** envinit()*/envinit(){int i;for (i=0;monenvs[i].name;i++) addEnvRec(&monenvs[i]);}Optdesc set_opts[] = { {"[name [val]]","display/set variable"}, {"var","variable to be set"}, {"value","value to be assigned"}, {"nvram","store current settings in nvram"}, {0}};/************************************************************** do_set(ac,av)*/do_set(ac,av)int ac;char *av[];{int i;EnvRec *p;#ifdef PMCC#ifdef NVRAMif (ac >= 2) { if (strequ(av[1],"nvram")) { if (nvCheck(0L)) set_nvram(ac-2,&av[2]); else printf("nvram not supported\n"); return; } }#endif#endif switch (ac) { case 1 : /* display all variables */ for (p=envChain;p;p=p->next) printvar(p); break; case 2 : /* display specific variable */ for (p=envChain;p;p=p->next) if (strequ(av[1],p->name)) break; if (p) printvar(p); /* 970827 */ else printf("%s: not found\n",av[1]); break; case 3 : /* set specific variable */ if (!setenv(av[1],av[2])) printf("%s: not found\n",av[1]); break; }}/************************************************************** setenv(name,value)*/setenv(name,value)char *name,*value;{int i;EnvRec *p;for (p=envChain;p;p=p->next) if (strequ(name,p->name)) break;if (!p) return(0);if (p->value) free(p->value);p->value = strdup(value);if (p->func) (* p->func)(name,value);return(1);}/************************************************************** printvar(i)*/printvar(p)EnvRec *p;{if (p->value == 0) printf("%10s = %-10s",p->name,"UNDEFINED");else if (strchr(p->value,' ')) printf("%10s = \"%s\"",p->name,p->value);else printf("%10s = %-10s",p->name,p->value);if (p->values) printf(" [%s]",p->values);printf("\n");}/************************************************************** char *getMonEnv(name) * returns pointer to current value of named variable */char *getMonEnv(name)char *name;{int i;EnvRec *p;for (p=envChain;p;p=p->next) if (strequ(name,p->name)) break;if (p == 0) return(0);return(p->value);}/************************************************************** int setdMonEnv(name,value) * set the value of decimal monitor env var. returns zero if* undefined.*/int setdMonEnv(name,value)char *name;int value;{char tmp[20];sprintf(tmp,"%d",value);return setenv(name,tmp);}/************************************************************** matchenv(name) * returns integer corresponding to current value */matchenv(name)char *name;{int i,j;char *t,wrd[20];EnvRec *p;for (p=envChain;p;p=p->next) if (strequ(name,p->name)) break;if (p == 0) return(-1);if (p->value == 0) p->value = strdup("");for (j=0,t=p->values;;j++) { t = getword(wrd,t); if (t == 0) return(-2); if (striequ(wrd,p->value)) return(j); }}/************************************************************** addEnvRec(p)* add a EnvRec to the envChain*/addEnvRec(p)EnvRec *p;{EnvRec *q;char buf[LINESZ];p->next = 0;p->value = 0;if (!envChain) { /* empty */ envChain = p; }else { for (q=envChain;q->next;q=q->next) ; /* find end of chain */ q->next = p; }sprintf(buf,"set %s '%s'",p->name,p->init);do_cmd(buf);}#ifdef PMCC#ifdef NVRAM/************************************************************** set_nvram(ac,av)*/set_nvram(ac,av)int ac;char *av[];{int i,j;char tmp[80];Ulong adr;EnvRec *p;/* write nvram */adr = 0;for (p=envChain;p;p=p->next) { if (p->value == 0) continue; sprintf(tmp,"set %s \"%s\"\n",p->name,p->value); for (j=0;j<strlen(tmp);j++,adr++) nvWrite(adr,tmp[j]); }/* get stty settings */for (i=0;;i++) { if (getstty(tmp,i)) break; for (j=0;j<strlen(tmp);j++,adr++) nvWrite(adr,tmp[j]); }/* write the p2 mark */nvWrite(adr++,'p');nvWrite(adr++,'2');nvWrite(adr++,'\n');/* get stuff from command line */for (i=0;i<ac;i++) { if (i) nvWrite(adr++,' '); for (j=0;j<strlen(av[i]);j++,adr++) nvWrite(adr,av[i][j]); }if (ac > 0) nvWrite(adr++,'\n');nvWrite(adr,0);}#endif#endif/************************************************************** do_diagsw(name,value)* Called when the envvar "diag" is changed.* "diag 0" turns diag off* "diag 1" turns on diag level 1 with output to stdout* "diag 2" turns on diag level 2 with output to stdout* "diag 1:tty1" turns on diag level 1 with output to tty1* "diag 2:tty1" turns on diag level 2 with output to tty1*/do_diagsw(name,value)char *name,*value;{char devname[20];int n;#if defined(VR4300) || defined(LR64388)/* the sscanf crashes on these processors. I have no idea why. */return;#endifif (dfp && dfp != stdout) fclose(dfp);dfp = 0;n = sscanf(value,"%d:%s",&verbose,devname);if (verbose == 0) return(0);switch (n) { case 1 : /* verbose level only */ dfp = stdout; break; case 2 : /* verbose level + device name */ dfp = fopen(devname,"w"); if (dfp) break; printf("can't open %s\n",devname); break; default: printf("%s: bad value\n",value); }return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -