Branch: Tag:

1996-08-06

1996-08-06 11:43:11 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

sscanf now accept field sizes for %s and %c

Rev: src/opcodes.c:1.6

429:    int match_len;    struct svalue sval;    int e,cnt,matches,eye,arg; -  int no_assign; +  int no_assign,field_length;    char set[256];    struct svalue *argp;   
473:    }   #endif    +  no_assign=0; +  field_length=-1; +     cnt++;    if(cnt>=match_len)    error("Error in sscanf format string.\n");    -  if(match[cnt]=='*') +  while(1)    { -  +  switch(match[cnt]) +  { +  case '*':    no_assign=1;    cnt++;    if(cnt>=match_len)    error("Error in sscanf format string.\n"); -  }else{ -  no_assign=0; -  } +  continue;    -  switch(match[cnt]) +  case '0': case '1': case '2': case '3': case '4': +  case '5': case '6': case '7': case '8': case '9':    { -  +  char *t; +  field_length=STRTOL(match+cnt,&t,10); +  cnt=t-match; +  continue; +  } +     case 'c': -  if(eye>=input_len) return matches; +  if(field_length == -1) field_length = 1; +  if(eye+field_length > input_len) return matches;    sval.type=T_INT;    sval.subtype=NUMBER_NUMBER; -  sval.u.integer=EXTRACT_UCHAR(input+eye); +  sval.u.integer=0; +  while(--field_length >= 0) +  { +  sval.u.integer<<=8; +  sval.u.integer|=EXTRACT_UCHAR(input+eye);    eye++; -  +  }    break;       case 'd':
565:    }       case 's': +  if(field_length != -1) +  { +  if(input_len - eye < field_length) +  return matches; +  +  sval.type=T_STRING; + #ifdef __CHECKER__ +  sval.subtype=0; + #endif +  sval.u.string=make_shared_binary_string(input+eye,field_length); +  eye+=field_length; +  break; +  } +     if(cnt+1>=match_len)    {    sval.type=T_STRING;
572:    sval.subtype=0;   #endif    sval.u.string=make_shared_binary_string(input+eye,input_len-eye); +  eye=input_len;    break;    }else{    char *end_str_start;
713:    default:    error("Unknown sscanf token %%%c\n",match[cnt]);    } +  break; +  }    matches++;       if(!no_assign)