int scan_test_set(const char * production, set_ * valid, set_ * stop)
{
  if (!set_includes_element(valid, SCAN_CAST->token))
  {
    if (stop != NULL)
    {
      if (production != NULL)
        text_message(TEXT_ERROR_ECHO, "In rule \'%s\', scanned ", production); 
      else
        text_message(TEXT_ERROR_ECHO, "Scanned ");
      set_print_element(SCAN_CAST->token, scan_token_names); 
      text_printf(" whilst expecting %s", set_cardinality(valid)== 1 ? "": "one of ");
      set_print_set(valid, scan_token_names, 60); 
      text_printf("\n"); 
      scan_skip(stop); 
    }
    return 0;
  }
  else
    return 1;
}
int scan_test(const char * production, const int valid, set_ * stop)
{
  if (valid != SCAN_CAST->token)
  {
    if (stop != NULL)
    {
      if (production != NULL)
        text_message(TEXT_ERROR_ECHO, "In rule \'%s\', scanned ", production); 
      else
        text_message(TEXT_ERROR_ECHO, "Scanned ");
      set_print_element(SCAN_CAST->token, scan_token_names); 
      text_printf(" whilst expecting "); 

      set_print_element(valid, scan_token_names); 
      text_printf("\n");
      scan_skip(stop); 
    }
    return 0; 
  }
  else
    return 1; 
}
Exemple #3
0
int8_t myscanf(const char *format , ...)
{
    //定义一个指向形参列表的指针pArg
    va_list pArg;
    char str[64];
    uint8_t i = 0;
    int8_t nb = 0; //记录参数个数

    FILE *fp;



    fp = fdopen(0,"r");

    if (NULL == fp)
    {
        perror("error\n");
        exit(EXIT_FAILURE);
    }

    fscanf(fp,"%[^'\n']",str);

    printf("iput=%s\n",str);

    va_start(pArg,format);//让pArg指向函数参数列表中的最后一个明确的参数,这里就是format参数.


    for(;*format != 0; format++)
    {

     if (isspace(*format))
            continue;
        //找到所输入的字符串中第一个非空格字符的下标,或I/O阻塞,从新输入
        i = scan_skip(str,i);


        if (*format == '%')
        {
        switch(*(++format))
        {
            case 'c':
            /* char */
                *va_arg(pArg,char *) = str[i++]; //给pArg所指向的地址空间单元赋值
                break;
            case 'd':
                /* decimal int */
            case 'u':
                /* unsigned int */
            i = scan_int(str,i,10,va_arg(pArg,int8_t *));  //va_arg()用来返回pArg所指向的地址单元中的值
                break;
            case 'f':
            i = scan_float(str,i,10,va_arg(pArg,float *));
                break;
            case 'o':
            i = scan_int(str,i,8,va_arg(pArg,int8_t *));
                break;
            case 'x':
            i = scan_int(str,i,16,va_arg(pArg,int8_t *));
                break;
            case 's':
            {
                int8_t j = 0;
                char *d = va_arg(pArg,char *);
                while ((d[j++] = str[i++]) != 0)
                    ;
            }
                break;
            /* long */
            case 'l':
                 switch (*(++format))
                {
                    case 'd':
                     /*decimal long */
                    case 'u':
                     i = scan_long(str,i,10,va_arg(pArg,int16_t *));
                         break;
                    case 'o':
                    i = scan_long(str,i,8,va_arg(pArg,int16_t *));
                         break;
                    case 'x':
                    i = scan_long(str,i,16,va_arg(pArg,int16_t *));
                         break;
                 }
            break;
            default:
                if (str[i] != *format)
                     return -1;
            break;
        }
        nb++;
    }else if (str[i] != *format)
        return -1;
    }
Exemple #4
0
INT8 scanf(char *fmt, ...)
{
    va_list ap;
    char s[64];
    UINT8 i = 0;
    INT8 nb = 0;

    gets(s);
    va_start(ap, fmt);
    for(; *fmt; fmt++) {
        if(isspace(*fmt))
            continue;
        i = scan_skip(s, i);
        if(*fmt == '%') {
            switch(*++fmt) {
            case 'c':
                /* char */
                *va_arg(ap, char *) = s[i++];
                break;
            case 'd':
            /* decimal int */
            case 'u':
                /* unsigned int */
                i = scan_int(s, i, 10, va_arg(ap, INT8 *));
                break;
            case 'o':
                /* octal int */
                i = scan_int(s, i, 8, va_arg(ap, INT8 *));
                break;
            case 'x':
                /* hexadecimal int */
                i = scan_int(s, i, 16, va_arg(ap, INT8 *));
                break;
            case 's':
                /* string */
            {
                INT8 j = 0;
                char *d = va_arg(ap, char *);
                while((d[j++] = s[i++]) != 0)
                    ;
            }
            break;
            case 'l':
                /* long */
                switch(*++fmt) {
                case 'd':
                /* decimal long */
                case 'u':
                    /* unsigned long */
                    i = scan_long(s, i, 10, va_arg(ap, INT16 *));
                    break;
                case 'o':
                    /* octal long */
                    i = scan_long(s, i, 8, va_arg(ap, INT16 *));
                    break;
                case 'x':
                    /* hexadecimal long */
                    i = scan_long(s, i, 16, va_arg(ap, INT16 *));
                    break;
                }
                break;
            default:
                if(s[i] != *fmt)
                    return -1;
                break;
            }
            nb++;
        } else if(s[i] != *fmt)
            return -1;
    }