Exemplo n.º 1
0
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
        {
Exemplo n.º 2
0
Arquivo: syntax.c Projeto: E-LLP/VICAR
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);
    }	    
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
Arquivo: syntax.c Projeto: E-LLP/VICAR
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);
    }
Exemplo n.º 5
0
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);
}