void print_dec(uint16_t value) { uint16_t remainder = value; remainder = print_digit(remainder, 1000); remainder = print_digit(remainder, 100); remainder = print_digit(remainder, 10); remainder = print_digit(remainder, 1); }
/** for each digit in string argument, * prints digit and ASCII integer code */ void print_digits(char arg[], int length) { int i = 0; for (i = 0; i < length; i++) { print_digit(arg[i]); } printf("\n"); }
static ER vprintf (B *fmt, VP arg0) { VP *ap; for (ap = (VP *)arg0; *fmt != '\0'; fmt++) { if ((*fmt) == '%') { ++fmt; switch (*fmt) { case 's': put_string (*(B **)ap, log_port); INC (ap, B *); break; case 'd': if ((W)*ap < 0) { ((W)*ap) = -((W)*ap); putc ('-', log_port); } print_digit ((W)*ap, 10); INC (ap, W); break; case 'x': print_digit ((UW)*ap, 16); INC (ap, W); break; default: putc ('%', log_port); break; } } else { putc (*fmt, log_port); } } }
static ER vfprintf (FILE *port, B *fmt, VP arg0) { VP *ap; for (ap = (VP *)arg0; *fmt != '\0'; fmt++) { if (*fmt == '%') { switch (*++fmt) { case 's': fputs ((B*)(*ap), port); INC (ap, B *); break; case 'd': if ((W)*ap < 0) { ((W)*ap) = 0 - ((W)*ap); putc ('-', port); } print_digit (port, (W)*ap, 10); INC (ap, W); break; case 'x': print_digit (port, (W)*ap, 16); INC (ap, W); break; default: putc ('%', port); break; } } else { putc (*fmt, port); } } }
void raster(std::string const& nums, int const& s) { for (int cnt = 1; cnt <= 2*s + 3; cnt++) { for (auto x: nums) { print_digit(x - '0', cnt, s); printf(" "); } printf("\n"); } }
void print_digit (UW d, UW base) { static B digit_table[] = "0123456789ABCDEF"; if (d < base) { putc ((W)(digit_table[d]), log_port); } else { print_digit (d / base, base); putc ((W)(digit_table[d % base]), log_port); } }
static void print_digit (FILE *port, UW d, UW base) { static B digit_table[] = "0123456789ABCDEF"; if (d < base) { putc (digit_table[d], port); } else { print_digit (port, d / base, base); putc (digit_table[d % base], port); } }
int main(int argc, char *argv[]) { FILE *fin, *fout; if(argc == 1) { // 错误:无输入文件 error_handle(file_exist_error); return 0; } //打开源程序文件 fin = fopen(argv[1],"r"); if(fin == NULL) { open_file_error(); return 0; } //打开文件保存词法分析结果 fout = fopen("temp.txt","w"); if(fout == NULL) { create_file_error(); return 0; } // 建立关键字的哈希表 int i; for(i = 0; i < 38; ++i) createHash(word[i],HashTable); //从源程序文件中取字符进行处理 char ch; unsigned char flag = 1; char str[100]; char *buffer = str; buffer = fgets(str,100,fin); char *begin,*forward; int length; char *end; while(!feof(fin)) { begin = forward = buffer; length = strlen(buffer); end = buffer + length; row = 1; // 记录当前的列号 while(forward < end) { begin = forward; ch = *forward; if( check_ch(ch)==0 ) { error_handle(illegal_ch_error); ++forward; ++row; // 移到下一列 continue; } if((ch == TAB || ch == NEWLINE || ch == SPACE)) { ++forward; ++row; begin = forward; continue; } if(isalpha(ch)) { ++forward; ++row; ch = *forward; // if( check_ch(ch) ==0) // { // error_handle(illegal_ch_error); // --forward; // copytoken(begin,forward); // ++forward; // print_word(token); // continue; // } while(isalnum(ch)&&(++row, ++forward != end)) { ch = *forward; } --forward; --row; copytoken(begin,forward); ++forward; ++row; print_word(token); } else if(isdigit(ch)) { ++forward; ++row; ch = *forward; // if(check_ch(ch)==0) // { // error_handle(illegal_ch_error); // } while(isdigit(ch)&&(++row, ++forward != end)) { ch = *forward; // if( check_ch(ch) == 0) // error_handle(illegal_ch_error); } --forward; --row; copytoken(begin,forward); ++forward; ++row; print_digit(token); } else { switch(ch) { case '*': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(MULTI,0)\n"); break; } if(ch == '*') printf("(EXP,0)\n"); else { --forward; --row; printf("(MULTI,0)\n"); } ++forward; ++row; break; case ':': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(COLON,0)\n"); break; } if(ch == '=') printf("(ASSIGN,0)\n"); else { --forward; --row; printf("(COLON,0)\n"); } ++forward; ++row; break; case '<': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(LT,0)\n"); break; } if(ch == '=') { printf("(LE,0)\n"); } else if(ch == '>') { printf("(NE,0)\n"); } else { --forward; --row; printf("(LT,0)\n"); } ++forward; ++row; break; case '=': printf("(EQ,0)\n"); ++forward; ++row; break; case '>': ++forward; ++row; ch = *forward; if( check_ch(ch)==0 ) { // error_handle(illegal_ch_error); // ++forward; printf("(GT,0)\n"); break; } if(ch == '=') printf("(GE,0)\n\n"); else { --forward; --row; printf("(GT,0)\n"); } ++forward; ++row; break; case '+': printf("(PLUS,0)\n"); ++forward; ++row; break; case '-': printf("(MINUS,0)\n"); ++forward; ++row; break; case '/': printf("(REIV,0)\n"); ++forward; ++row; break; case ',': printf("(COMMA,0)\n"); ++forward; ++row; break; case ';': printf("(SEMIC,0)\n"); ++forward; ++row; break; case '(': printf("(LR_BRAC,0)\n"); int flag = 0; // 用于判断括号是否匹配 char* temp; temp = forward; while(++temp != end) { if(ch == '(') ++flag; else if(ch == ')') --flag; if(flag < 0) break; ch = *temp; } if(flag != 0) error_handle(par_not_match); ++forward; ++row; break; case ')': printf("(RR_BRAC,0)\n"); ++forward; ++row; break; case '[': printf("(LS_BRAC,0)\n"); ++forward; ++row; break; case ']': printf("(RS_BRAC,0)\n"); ++forward; ++row; break; case '\'': // printf("(Q_MARK,0)\n"); ++forward; ++row; ch = *forward; while(ch != '\''&& (++row, ++forward != end)) { ch = *forward; if(!check_ch(ch)) error_handle(illegal_ch_error); // ++forward; } // --forward; if(ch == '\'') { copytoken(begin, forward); // 输出字符串 print_str(token); } else if(forward == end) { error_handle(quo_not_match); // 引号不匹配 } ++forward; ++row; break; case '.': printf("(F_STOP,0)\n"); ++forward; ++row; break; case '^': printf("(CAP,0)\n"); ++forward; ++row; break; default: // error_handle(); break; } } } // 再从文件中读入一行数据 buffer = fgets(str,100,fin); ++line; } //关闭源程序和结果文件 fclose(fin); fclose(fout); return 0; }