Subversion Repositories Kolibri OS

Rev

Rev 4865 | Rev 4882 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  macro test_err
  2.  {  local   ..not_error
  3.     cmp     [error_n], 0
  4.     je      ..not_error
  5.     ret
  6.  ..not_error:
  7.  }
  8.  
  9.  macro set_err err
  10.  {
  11.     mov     [error_n], err
  12.     ret
  13.  }
  14.  
  15.  ; ---------------------------
  16.  
  17.  proc parse
  18.     mov     [exp_pos], 0
  19.     stdcall skip_spaces
  20.  
  21.     mov     ebx, exp
  22.     add     ebx, [exp_pos]
  23.     cmp     [ebx], byte 0
  24.     je      .null_exp
  25.  
  26.     mov     [exp_lvl], 0
  27.     mov     [error_n], 0
  28.     stdcall parse_lvl0
  29.     ret
  30.  
  31.  .null_exp:
  32.     mov     eax, 0
  33.     ret
  34.  endp
  35.  
  36.  ; ---------------------------
  37.  
  38.  proc parse_lvl0 uses ebx ecx
  39.     test_err
  40.     stdcall parse_lvl1
  41.     test_err
  42.   @@:
  43.     mov     ebx, exp
  44.     add     ebx, [exp_pos]
  45.     cmp     [ebx], byte 0
  46.     je      .end
  47.     cmp     [ebx], byte ")"
  48.     je      .brk_end
  49.     inc     [exp_pos]
  50.     cmp     [ebx], byte "+"
  51.     jne     .not_add
  52.     mov     ecx, eax
  53.     stdcall parse_lvl1
  54.     test_err
  55.     add     eax, ecx
  56.     jmp     @b
  57.  .not_add:
  58.     cmp     [ebx], byte "-"
  59.     jne     .unexp_char
  60.     mov     ecx, eax
  61.     stdcall parse_lvl1
  62.     test_err
  63.     sub     ecx, eax
  64.     mov     eax, ecx
  65.     jmp     @b
  66.  .brk_end:
  67.     cmp     [exp_lvl], 0
  68.     jne     @f
  69.     set_err 3
  70.   @@:
  71.     dec     [exp_lvl]
  72.  .end:
  73.     ret
  74.  .unexp_char:
  75.     set_err 4
  76.  endp
  77.  
  78.  ; ---------------------------
  79.  
  80.  proc parse_lvl1 uses ebx ecx edx
  81.     test_err
  82.     stdcall parse_lvl2
  83.     test_err
  84.   @@:
  85.     mov     ebx, exp
  86.     add     ebx, [exp_pos]
  87.     cmp     [ebx], byte 0
  88.     je      .end
  89.     cmp     [ebx], byte "*"
  90.     jne     .not_mul
  91.     inc     [exp_pos]
  92.     mov     ecx, eax
  93.     stdcall parse_lvl2
  94.     test_err
  95.     imul    ecx, eax
  96.     mov     eax, ecx
  97.     jmp     @b
  98.  .not_mul:
  99.     cmp     [ebx], byte "/"
  100.     je      .div_or_mod
  101.     cmp     [ebx], byte "%"
  102.     je      .div_or_mod
  103.     jmp     .end
  104.  .div_or_mod:
  105.     inc     [exp_pos]
  106.     mov     ecx, eax
  107.     stdcall parse_lvl2
  108.     test_err
  109.     cmp     eax, 0
  110.     jne     .not_null
  111.     set_err 1
  112.  .not_null:
  113.     xchg    ecx, eax
  114.     cdq
  115.     div     ecx
  116.     cmp     [ebx], byte "%"
  117.     je      .mod
  118.     jmp     @b
  119.  .mod:
  120.     mov     eax, edx
  121.     jmp     @b
  122.  .end:
  123.     ret
  124.  endp
  125.  
  126.  ; ---------------------------
  127.  
  128.  proc parse_lvl2 uses ebx ecx edx
  129.     test_err
  130.     stdcall parse_lvl3
  131.     test_err
  132.   @@:
  133.     mov     ebx, exp
  134.     add     ebx, [exp_pos]
  135.     cmp     [ebx], byte 0
  136.     je      .end
  137.     cmp     [ebx], byte "^"
  138.     jne     .end
  139.     inc     [exp_pos]
  140.     mov     ecx, eax
  141.     stdcall parse_lvl2
  142.     test_err
  143.     stdcall c_power
  144.     jmp     @b
  145.  .end:
  146.     ret
  147.  endp
  148.  
  149.  ; ---------------------------
  150.  
  151.  proc parse_lvl3 uses ebx
  152.     test_err
  153.     stdcall skip_spaces
  154.     mov     ebx, exp
  155.     add     ebx, [exp_pos]
  156.     cmp     [ebx], byte 48
  157.     jl      @f
  158.     cmp     [ebx], byte 57
  159.     jg      @f
  160.     stdcall parse_lvl4
  161.     jmp     .end
  162.   @@:
  163.     inc     [exp_pos]
  164.     cmp     [ebx], byte "("
  165.     jne     @f
  166.     inc     [exp_lvl]
  167.     stdcall parse_lvl0
  168.     test_err
  169.     mov     ebx, exp
  170.     add     ebx, [exp_pos]
  171.     cmp     [ebx], byte ")"
  172.     je      .brk_ok
  173.     set_err 2
  174.  .brk_ok:
  175.     inc     [exp_pos]
  176.     jmp     .end
  177.   @@:
  178.     cmp     [ebx], byte "+"
  179.     jne     @f
  180.     stdcall parse_lvl3
  181.     test_err
  182.     jmp     .end
  183.   @@:
  184.     cmp     [ebx], byte "-"
  185.     jne     .unexp_char
  186.     stdcall parse_lvl3
  187.     test_err
  188.     neg     eax
  189.  .end:
  190.     stdcall skip_spaces
  191.     ret
  192.  .unexp_char:
  193.     set_err 4
  194.  endp
  195.  
  196.  ; ---------------------------
  197.  
  198.  proc parse_lvl4 uses ebx ecx
  199.     stdcall parse_lvl5
  200.   @@:
  201.     mov     ebx, exp
  202.     add     ebx, [exp_pos]
  203.     cmp     [ebx], byte 0
  204.     je      .end
  205.     cmp     [ebx], byte "^"
  206.     jne     .end
  207.     inc     [exp_pos]
  208.     mov     ecx, eax
  209.     mov     ebx, exp
  210.     add     ebx, [exp_pos]
  211.     cmp     [ebx], byte 48
  212.     jl      .unexp_char
  213.     cmp     [ebx], byte 57
  214.     jg      .unexp_char
  215.     stdcall parse_lvl4
  216.     stdcall c_power
  217.     jmp     @b
  218.  .end:
  219.     ret
  220.  .unexp_char:
  221.     set_err 4
  222.  endp
  223.  
  224.  ; ---------------------------
  225.  
  226.  proc parse_lvl5 uses ebx ecx
  227.     sub     eax, eax
  228.     sub     ecx, ecx
  229.     mov     ebx, exp
  230.     add     ebx, [exp_pos]
  231.   @@:
  232.     cmp     [ebx], byte 0
  233.     je      @f
  234.     cmp     [ebx], byte 48
  235.     jl      @f
  236.     cmp     [ebx], byte 57
  237.     jg      @f
  238.     imul    eax, 10
  239.     mov     cl, [ebx]
  240.     add     eax, ecx
  241.     sub     eax, 48
  242.     inc     ebx
  243.     inc     [exp_pos]
  244.     jmp     @b
  245.   @@:
  246.     ret
  247.  endp
  248.  
  249.  ; ---------------------------
  250.  
  251.  proc skip_spaces uses ebx
  252.     mov     ebx, exp
  253.     add     ebx, [exp_pos]
  254.   @@:
  255.     cmp     [ebx], byte " "
  256.     jne     @f
  257.     inc     ebx
  258.     inc     [exp_pos]
  259.     jmp     @b
  260.   @@:
  261.     ret
  262.  endp
  263.  
  264.  ; ---------------------------
  265.  
  266.  proc c_power uses ebx
  267.     mov     ebx, eax
  268.     mov     eax, 1
  269.   @@:
  270.     cmp     ebx, 0
  271.     je      @f
  272.     imul    eax, ecx
  273.     dec     ebx
  274.     jmp     @b
  275.   @@:
  276.     ret
  277.  endp
  278.  
  279.  ; ---------------------------
  280.  
  281.  proc convert_to_str uses ebx ecx edx esi edi, _num, _str
  282.     mov     eax, [_num]
  283.     mov     esi, [_str]
  284.     mov     edi, 0
  285.     mov     ecx, eax
  286.     and     ecx, 1 shl 31
  287.     cmp     ecx, 0
  288.     je      @f
  289.     mov     [esi], byte "-"
  290.     inc     esi
  291.     inc     edi
  292.     not     eax
  293.     inc     eax
  294.   @@:
  295.     mov     ebx, 10
  296.     xor     ecx, ecx
  297.   @@:
  298.     xor     edx, edx
  299.     div     ebx
  300.     push    edx
  301.     inc     ecx
  302.     inc     edi
  303.     cmp     eax, 0
  304.     jne     @b
  305.   @@:
  306.     pop     eax
  307.     add     al, "0"
  308.     mov     [esi], al
  309.     inc     esi
  310.     loop    @b
  311.     mov     [esi], byte 0
  312.     mov     eax, edi
  313.     ret
  314.  endp