Exemple #1
0
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);
}
Exemple #2
0
/** 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");
}
Exemple #3
0
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);
	}
    }
}
Exemple #4
0
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");
    }
}
Exemple #6
0
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);
    }
}
Exemple #7
0
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);
    }
}
Exemple #8
0
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;
}