void ffscanf(FILE *in, char *fmt, ...) { va_list ap; char *p; char buf[STRLEN]; int i, fld; double dval; va_start(ap, fmt); for (p = fmt; *p; p++) { if (*p == '%') { p++; fld = getfld(&p); for (i = 0; (i < fld); ) { buf[i] = fgetc(in); if (buf[i] != '\n') { i++; } } buf[fld] = '\0'; switch (*p) { case 'd': sscanf(buf, "%d", va_arg(ap, int *)); break; case 'f': sscanf(buf, "%f", va_arg(ap, float *)); break; case 'F': sscanf(buf, "%lf", va_arg(ap, double *)); break; case 'r': sscanf(buf, "%lf", &dval); *(va_arg(ap, real *)) = dval; break; default: break; } } else {
FUNCTION static CODE de_ref ( FAST struct SYNBLK *sb, /* in/out: syntax blk -- cmd stream*/ FAST TEXT name[F_Q_NAMESIZ+1] /* out: deref'd var name string */ ) { TEXT token[TOKESIZ+1]; FAST CODE toke_type; TEXT *init_pos, *fld_pos; CODE code; name[0] = EOS; init_pos = SAVPOS; toke_type = gettok(sb, token); if (toke_type == S_WHITE) toke_type = gettok(sb, token); if (toke_type == '@') { fld_pos = SAVPOS; /* posit of begin of name field */ toke_type = gettok(sb, token); /* look for symbol */ if (toke_type == S_ALPHA || toke_type == S_QALPHA) { SETPOS(fld_pos); /* back up to get entire name fld*/ code = getfld(sb, token); if (code == SUCCESS || code == S_WHITE || code == S_COMSEP || code == EOS) { s_bcopy(token, name, F_Q_NAMESIZ); (*sb).lstcg = code; return (SUCCESS); } } (*sb).errchr = (*sb).curchr - 1; synerr(sb, "A variable name must follow '@'."); return (S_SYNERR); } SETPOS(init_pos); /* return to init pos */ return (FAIL); }
void gmx_fatal(int f_errno,const char *file,int line,const char *fmt,...) { va_list ap; const char *p; char cval,*sval,msg[STRLEN]; char ibuf[64],ifmt[64]; int index,ival,fld,len; double dval; #ifdef _SPECIAL_VAR_ARG int f_errno,line; char *fmt,*file; va_start(ap,); f_errno = va_arg(ap,int); file = va_arg(ap,char *); line = va_arg(ap,int); fmt = va_arg(ap,char *); #else va_start(ap,fmt); #endif clean_fatal_tmp_file(); len=0; for (p=fmt; *p; p++) { if (*p!='%') bputc(msg,&len,*p); else { p++; fld=getfld(&p); switch(*p) { case 'x': ival=va_arg(ap,int); sprintf(ifmt,"0x%%%dx",fld); sprintf(ibuf,ifmt,(unsigned int)ival); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'd': ival=va_arg(ap,int); sprintf(ifmt,"%%%dd",fld); sprintf(ibuf,ifmt,ival); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'u': ival=va_arg(ap,unsigned); sprintf(ifmt,"%%%du",fld); sprintf(ibuf,ifmt,ival); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'f': dval=va_arg(ap,double); sprintf(ifmt,"%%%df",fld); sprintf(ibuf,ifmt,dval); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'g': dval=va_arg(ap,double); sprintf(ifmt,"%%%dg",fld); sprintf(ibuf,ifmt,dval); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'c': cval=(char) va_arg(ap,int); /* char is promoted to int */ bputc(msg,&len,cval); break; case 's': sval=va_arg(ap,char *); if (sval == NULL) sval = strdup("(null)"); bputs(msg,&len,sval,fld); break; case '%': bputc(msg,&len,*p); break; default: break; } } } va_end(ap); bputc(msg,&len,'\0'); fatal_errno = f_errno; _gmx_error("fatal",msg,file,line); }
FUNCTION CODE getval ( FAST struct SYNBLK *sb, /* in/out: syntax block */ FAST TEXT *value[], /* out: array of pointers to strings */ FUNINT maxval, /* in: dimension of value */ COUNT *count /* out: actual number of values:*/ /* -1 = no value, 0 = -- */ ) { CODE toktyp; /* token type */ FAST CODE i; TEXT field[TOKESIZ+1]; /* single value field */ CODE code, status; /* return code */ GENPTR pos; TEXT token[TOKESIZ+1]; *count = 0; code = SUCCESS; pos = SAVPOS; /* save position for look-ahead */ if (dash_dash(sb)) { *count = 0; return (SUCCESS); /* note *count is zero for -- */ } status = de_ref (sb, field); /* look for de-reference syntax */ if (status == SUCCESS) { value[0] = s_save (field); if (value[0] == NULL) goto gv_merr; *count = 1; return (S_DEREF); } else if (status == S_SYNERR) return (status); if ((toktyp = gettok(sb, token)) == S_WHITE) /* get token... */ toktyp = gettok(sb, token); /* if white, get another */ if (toktyp == S_COMSEP) /* if no value */ *count = -1; else if (toktyp == S_SYNERR) goto gv_serr; /* if syntax error */ else if (toktyp == '(' ) /* left paren seen - assume multi-valued*/ { igfdp(sb); /* init block for getfld (w/in parens) */ for (i = getfld(sb, field); i != S_RPAREN; i = getfld(sb, field)) { if (i == S_SYNERR || i == EOS) goto gv_bval; if (*count >= maxval) goto gv_mval; /* error if max values reached */ value[*count] = s_save(field); /*set value ptr to alloc values */ if (value[*count] == NULL) goto gv_merr; /* no memory left */ (*count)++; } if (*count == 0) *count = -1; /* flag 'no value' */ (*sb).lstcg = S_RPAREN; /* last terminator is right paren */ } else /* not multi-valued */ { SETPOS(pos); /* restore cmd stream position */ if ((i = getfld(sb, field)) == S_SYNERR || i == S_RPAREN || i == '=') goto gv_serr; else if (i == EOS) code = EOS; else if (!NULLSTR(field) || i == S_QUOTED) { value[0] = s_save(field); if (value[0] == NULL) goto gv_merr; *count = 1; } else if (NULLSTR(field)) *count = -1; /* flag for 'no value' */ } return(code); gv_serr: (*sb).errchr = (*sb).curchr - 1; /* point to error detection */ synerr(sb, "Invalid value format"); /* put EM in block */ code = S_SYNERR; return(code); gv_bval: code = S_SYNERR; (*sb).errchr = (*sb).curchr - 1; /* point to error detection */ synerr(sb, "Missing value or invalid value format"); free_val (value, *count); /* free values allocated before error */ *count = 0; return(code); gv_mval: (*sb).errchr = (*sb).curchr - 1; /* point to error detection */ s_copy("Maximum number of values exceeded", (*sb).errmsg); code = S_SYNERR; free_val(value, *count); /* free values allocated before error */ *count = 0; return(code); gv_merr: code = S_SYNERR; (*sb).errchr = (*sb).curchr - 1; /* point to error detection */ synerr(sb, "TAE Monitor internal memory overflow"); free_val (value, *count); /* free values allocated before error */ *count = 0; return(code); }
void fatal_error(int fatal_errno,char *fmt,...) { va_list ap; char *p,cval,*sval,msg[STRLEN]; char ibuf[64],ifmt[64]; int index,ival,fld,len; double dval; #ifdef _SPECIAL_VAR_ARG int fatal_errno; char *fmt; va_start(ap,); fatal_errno=va_arg(ap,int); fmt=va_arg(ap,char *); #else va_start(ap,fmt); #endif if (fatal_tmp_file) { fprintf(stderr,"Cleaning up temporary file %s\n",fatal_tmp_file); remove(fatal_tmp_file); sfree(fatal_tmp_file); fatal_tmp_file = NULL; } len=0; bputs(msg,&len,"Fatal error: ",0); for (p=fmt; *p; p++) { if (*p!='%') bputc(msg,&len,*p); else { p++; fld=getfld(&p); switch(*p) { case 'x': ival=va_arg(ap,int); sprintf(ifmt,"0x%%%dx",fld); sprintf(ibuf,ifmt,(unsigned int)ival); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'd': ival=va_arg(ap,int); sprintf(ifmt,"%%%dd",fld); sprintf(ibuf,ifmt,ival); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'f': dval=va_arg(ap,double); sprintf(ifmt,"%%%df",fld); sprintf(ibuf,ifmt,dval); for(index=0; (index<(int)strlen(ibuf)); index++) bputc(msg,&len,ibuf[index]); break; case 'c': cval=(char) va_arg(ap,int); /* char is promoted to int */ bputc(msg,&len,cval); break; case 's': sval=va_arg(ap,char *); bputs(msg,&len,sval,fld); break; default: break; } } } va_end(ap); bputc(msg,&len,'\0'); quit_gmx(fatal_errno,msg); }