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; }
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; }
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; }