Subversion Repositories Kolibri OS

Rev

Rev 4875 | 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.  proc convert_to_str uses ebx ecx edx esi edi, _num, _str
  16.     mov     eax, [_num]
  17.     mov     esi, [_str]
  18.     mov     edi, 0
  19.     mov     ecx, eax
  20.     and     ecx, 1 shl 31
  21.     cmp     ecx, 0
  22.     je      @f
  23.     mov     [esi], byte "-"
  24.     inc     esi
  25.     inc     edi
  26.     not     eax
  27.     inc     eax
  28.   @@:
  29.     mov     ebx, 10
  30.     xor     ecx, ecx
  31.   @@:
  32.     xor     edx, edx
  33.     div     ebx
  34.     push    edx
  35.     inc     ecx
  36.     inc     edi
  37.     cmp     eax, 0
  38.     jne     @b
  39.   @@:
  40.     pop     eax
  41.     add     al, "0"
  42.     mov     [esi], al
  43.     inc     esi
  44.     loop    @b
  45.     mov     [esi], byte 0
  46.     mov     eax, edi
  47.     ret
  48.  endp
  49.  
  50.  ; ---------------------------
  51.  
  52.  proc parse
  53.     mov     [exp_pos], 0
  54.     mov     [error_n], 0
  55.     stdcall parse_lvl0
  56.     ret
  57.  endp
  58.  
  59.  ; ---------------------------
  60.  
  61.  proc parse_lvl0 uses ebx ecx
  62.     test_err
  63.     stdcall parse_lvl1
  64.     test_err
  65.   @@:
  66.     mov     ebx, exp
  67.     add     ebx, [exp_pos]
  68.     cmp     [ebx], byte 0
  69.     je      .end
  70.     cmp     [ebx], byte ")"
  71.     je      .end
  72.     inc     [exp_pos]
  73.     cmp     [ebx], byte "+"
  74.     jne     .not_add
  75.     mov     ecx, eax
  76.     stdcall parse_lvl1
  77.     test_err
  78.     add     eax, ecx
  79.     jmp     @b
  80.  .not_add:
  81.     cmp     [ebx], byte "-"
  82.     jne     @b
  83.     mov     ecx, eax
  84.     stdcall parse_lvl1
  85.     test_err
  86.     sub     ecx, eax
  87.     mov     eax, ecx
  88.     jmp     @b
  89.  .end:
  90.     ret
  91.  endp
  92.  
  93.  ; ---------------------------
  94.  
  95.  proc parse_lvl1 uses ebx ecx edx
  96.     test_err
  97.     stdcall parse_lvl2
  98.     test_err
  99.   @@:
  100.     mov     ebx, exp
  101.     add     ebx, [exp_pos]
  102.     cmp     [ebx], byte 0
  103.     je      .end
  104.     inc     [exp_pos]
  105.     cmp     [ebx], byte "*"
  106.     jne     .not_mul
  107.     mov     ecx, eax
  108.     stdcall parse_lvl2
  109.     test_err
  110.     imul    ecx, eax
  111.     mov     eax, ecx
  112.     jmp     @b
  113.  .not_mul:
  114.     cmp     [ebx], byte "/"
  115.     je      .div_or_mod
  116.     cmp     [ebx], byte "%"
  117.     je      .div_or_mod
  118.     jmp     .end
  119.  .div_or_mod:
  120.     mov     ecx, eax
  121.     stdcall parse_lvl2
  122.     test_err
  123.     cmp     eax, 0
  124.     jne     .not_null
  125.     set_err 1
  126.  .not_null:
  127.     xchg    ecx, eax
  128.     cdq
  129.     div     ecx
  130.     cmp     [ebx], byte "%"
  131.     je      .mod
  132.     jmp     @b
  133.  .mod:
  134.     mov     eax, edx
  135.     jmp     @b
  136.  .end:
  137.     dec     [exp_pos]
  138.     ret
  139.  endp
  140.  
  141.  ; ---------------------------
  142.  
  143.  proc parse_lvl2 uses ebx
  144.     test_err
  145.     stdcall skip_spaces
  146.     mov     ebx, exp
  147.     add     ebx, [exp_pos]
  148.     cmp     [ebx], byte 48
  149.     jl      @f
  150.     cmp     [ebx], byte 57
  151.     jg      @f
  152.     stdcall parse_lvl3
  153.     jmp     .end
  154.   @@:
  155.     inc     [exp_pos]
  156.     cmp     [ebx], byte "("
  157.     jne     @f
  158.     stdcall parse_lvl0
  159.     test_err
  160.     inc     [exp_pos]
  161.     jmp     .end
  162.   @@:
  163.     cmp     [ebx], byte "+"
  164.     jne     @f
  165.     stdcall parse_lvl2
  166.     test_err
  167.     jmp     .end
  168.   @@:
  169.     cmp     [ebx], byte "-"
  170.     jne     .end
  171.     stdcall parse_lvl2
  172.     test_err
  173.     neg     eax
  174.  .end:
  175.     stdcall skip_spaces
  176.     ret
  177.  endp
  178.  
  179.  ; ---------------------------
  180.  
  181.  proc parse_lvl3 uses ebx ecx
  182.     sub     eax, eax
  183.     sub     ecx, ecx
  184.     mov     ebx, exp
  185.     add     ebx, [exp_pos]
  186.   @@:
  187.     cmp     [ebx], byte 0
  188.     je      @f
  189.     cmp     [ebx], byte 48
  190.     jl      @f
  191.     cmp     [ebx], byte 57
  192.     jg      @f
  193.     imul    eax, 10
  194.     mov     cl, [ebx]
  195.     add     eax, ecx
  196.     sub     eax, 48
  197.     inc     ebx
  198.     inc     [exp_pos]
  199.     jmp     @b
  200.   @@:
  201.     ret
  202.  endp
  203.  
  204.  ; ---------------------------
  205.  
  206.  proc skip_spaces uses ebx
  207.     mov     ebx, exp
  208.     add     ebx, [exp_pos]
  209.   @@:
  210.     cmp     [ebx], byte " "
  211.     jne     @f
  212.     inc     ebx
  213.     inc     [exp_pos]
  214.     jmp     @b
  215.   @@:
  216.     ret
  217.  endp