Subversion Repositories Kolibri OS

Rev

Rev 4882 | 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.     cmp     [ebx], byte "|"
  50.     je      .abs_end
  51.     inc     [exp_pos]
  52.     cmp     [ebx], byte "+"
  53.     jne     .not_add
  54.     mov     ecx, eax
  55.     stdcall parse_lvl1
  56.     test_err
  57.     add     eax, ecx
  58.     jmp     @b
  59.  .not_add:
  60.     cmp     [ebx], byte "-"
  61.     jne     .unexp_char
  62.     mov     ecx, eax
  63.     stdcall parse_lvl1
  64.     test_err
  65.     sub     ecx, eax
  66.     mov     eax, ecx
  67.     jmp     @b
  68.  .brk_end:
  69.     cmp     [exp_lvl], 0
  70.     jne     @f
  71.     set_err 3
  72.   @@:
  73.     dec     [exp_lvl]
  74.     jmp     .end
  75.  .abs_end:
  76.     cmp     [abs_lvl], 0
  77.     jne     @f
  78.     set_err 5
  79.   @@:
  80.     dec     [abs_lvl]
  81.  .end:
  82.     ret
  83.  .unexp_char:
  84.     set_err 4
  85.  endp
  86.  
  87.  ; ---------------------------
  88.  
  89.  proc parse_lvl1 uses ebx ecx edx
  90.     test_err
  91.     stdcall parse_lvl2
  92.     test_err
  93.   @@:
  94.     mov     ebx, exp
  95.     add     ebx, [exp_pos]
  96.     cmp     [ebx], byte 0
  97.     je      .end
  98.     cmp     [ebx], byte "*"
  99.     jne     .not_mul
  100.     inc     [exp_pos]
  101.     mov     ecx, eax
  102.     stdcall parse_lvl2
  103.     test_err
  104.     imul    ecx, eax
  105.     mov     eax, ecx
  106.     jmp     @b
  107.  .not_mul:
  108.     cmp     [ebx], byte "/"
  109.     je      .div_or_mod
  110.     cmp     [ebx], byte "%"
  111.     je      .div_or_mod
  112.     jmp     .end
  113.  .div_or_mod:
  114.     inc     [exp_pos]
  115.     mov     ecx, eax
  116.     stdcall parse_lvl2
  117.     test_err
  118.     cmp     eax, 0
  119.     jne     .not_null
  120.     set_err 1
  121.  .not_null:
  122.     xchg    ecx, eax
  123.     cdq
  124.     div     ecx
  125.     cmp     [ebx], byte "%"
  126.     je      .mod
  127.     jmp     @b
  128.  .mod:
  129.     mov     eax, edx
  130.     jmp     @b
  131.  .end:
  132.     ret
  133.  endp
  134.  
  135.  ; ---------------------------
  136.  
  137.  proc parse_lvl2 uses ebx ecx edx
  138.     test_err
  139.     stdcall parse_lvl3
  140.     test_err
  141.   @@:
  142.     mov     ebx, exp
  143.     add     ebx, [exp_pos]
  144.     cmp     [ebx], byte 0
  145.     je      .end
  146.     cmp     [ebx], byte "^"
  147.     jne     .end
  148.     inc     [exp_pos]
  149.     mov     ecx, eax
  150.     stdcall parse_lvl2
  151.     test_err
  152.     stdcall c_power
  153.     jmp     @b
  154.  .end:
  155.     ret
  156.  endp
  157.  
  158.  ; ---------------------------
  159.  
  160.  proc parse_lvl3 uses ebx ecx edx
  161.     test_err
  162.     stdcall skip_spaces
  163.     mov     ebx, exp
  164.     add     ebx, [exp_pos]
  165.     cmp     [ebx], byte 48
  166.     jl      @f
  167.     cmp     [ebx], byte 57
  168.     jg      @f
  169.     stdcall parse_lvl4
  170.     jmp     .end
  171.   @@:
  172.     cmp     [ebx], byte 97
  173.     jl      @f
  174.     cmp     [ebx], byte 122
  175.     jg      @f
  176.     jmp     .parse_func
  177.   @@:
  178.     inc     [exp_pos]
  179.     cmp     [ebx], byte "("
  180.     jne     @f
  181.     inc     [exp_lvl]
  182.     stdcall parse_lvl0
  183.     test_err
  184.     mov     ebx, exp
  185.     add     ebx, [exp_pos]
  186.     cmp     [ebx], byte ")"
  187.     je      .brk_ok
  188.     set_err 2
  189.  .brk_ok:
  190.     inc     [exp_pos]
  191.     jmp     .end
  192.   @@:
  193.     cmp     [ebx], byte "|"
  194.     jne     @f
  195.     inc     [abs_lvl]
  196.     stdcall parse_lvl0
  197.     test_err
  198.     mov     ebx, exp
  199.     add     ebx, [exp_pos]
  200.     cmp     [ebx], byte "|"
  201.     je      .abs_ok
  202.     set_err 5
  203.  .abs_ok:
  204.     inc     [exp_pos]
  205.     cmp     eax, 0
  206.     jge     .end
  207.     not     eax
  208.     inc     eax
  209.     jmp     .end
  210.   @@:
  211.     cmp     [ebx], byte "+"
  212.     jne     @f
  213.     stdcall parse_lvl3
  214.     test_err
  215.     jmp     .end
  216.   @@:
  217.     cmp     [ebx], byte "-"
  218.     jne     .unexp_char
  219.     stdcall parse_lvl3
  220.     test_err
  221.     neg     eax
  222.  .end:
  223.     stdcall skip_spaces
  224.     ret
  225.  .unexp_char:
  226.     set_err 4
  227.  .parse_func:
  228.     mov     ecx, 0
  229.     mov     dl, 0
  230.   @@:
  231.     cmp     [ebx], byte 97
  232.     jl      @f
  233.     cmp     [ebx], byte 122
  234.     jg      @f
  235.     cmp     dl, 4
  236.     je      .unexp_char
  237.     shl     ecx, 8
  238.     mov     cl, [ebx]
  239.     inc     dl
  240.     inc     ebx
  241.     inc     [exp_pos]
  242.     jmp     @b
  243.   @@:
  244.     cmp     ecx, "cni"
  245.     je      @f
  246.     cmp     ecx, "ced"
  247.     je      @f
  248.     cmp     ecx, "sba"
  249.     je      @f
  250.     cmp     ecx, "rqs"
  251.     je      @f
  252.     jmp     .unexp_char
  253.   @@:
  254.     stdcall skip_spaces
  255.     mov     ebx, exp
  256.     add     ebx, [exp_pos]
  257.     cmp     [ebx], byte "("
  258.     jne     .unexp_char
  259.     inc     [exp_lvl]
  260.     inc     [exp_pos]
  261.     stdcall parse_lvl0
  262.     test_err
  263.     mov     ebx, exp
  264.     add     ebx, [exp_pos]
  265.     cmp     [ebx], byte ")"
  266.     je      @f
  267.     set_err 2
  268.   @@:
  269.     inc     [exp_pos]
  270.     stdcall skip_spaces
  271.     cmp     ecx, "cni"
  272.     jne     @f
  273.     inc     eax
  274.     jmp     .f_end
  275.   @@:
  276.     cmp     ecx, "ced"
  277.     jne     @f
  278.     dec     eax
  279.     jmp     .f_end
  280.   @@:
  281.     cmp     ecx, "sba"
  282.     jne     @f
  283.     mov     ecx, eax
  284.     shr     ecx, 31
  285.     cmp     cl, 1
  286.     jne     .f_end
  287.     not     eax
  288.     inc     eax
  289.     jmp     .f_end
  290.   @@:
  291.     cmp     ecx, "rqs"
  292.     jne     @f
  293.     imul    eax, eax
  294.     jmp     .f_end
  295.   @@:
  296.     jmp     .unexp_char
  297.  .f_end:
  298.     ret
  299.  endp
  300.  
  301.  ; ---------------------------
  302.  
  303.  proc parse_lvl4 uses ebx ecx
  304.     stdcall skip_spaces
  305.     stdcall parse_lvl5
  306.     stdcall skip_spaces
  307.   @@:
  308.     mov     ebx, exp
  309.     add     ebx, [exp_pos]
  310.     cmp     [ebx], byte 0
  311.     je      .end
  312.     cmp     [ebx], byte "^"
  313.     jne     .end
  314.     inc     [exp_pos]
  315.     stdcall skip_spaces
  316.     mov     ecx, eax
  317.     mov     ebx, exp
  318.     add     ebx, [exp_pos]
  319.     cmp     [ebx], byte 48
  320.     jl      .unexp_char
  321.     cmp     [ebx], byte 57
  322.     jg      .unexp_char
  323.     stdcall parse_lvl4
  324.     stdcall c_power
  325.     jmp     @b
  326.  .end:
  327.     ret
  328.  .unexp_char:
  329.     set_err 4
  330.  endp
  331.  
  332.  ; ---------------------------
  333.  
  334.  proc parse_lvl5 uses ebx ecx
  335.     sub     eax, eax
  336.     sub     ecx, ecx
  337.     mov     ebx, exp
  338.     add     ebx, [exp_pos]
  339.   @@:
  340.     cmp     [ebx], byte 0
  341.     je      @f
  342.     cmp     [ebx], byte 48
  343.     jl      @f
  344.     cmp     [ebx], byte 57
  345.     jg      @f
  346.     imul    eax, 10
  347.     mov     cl, [ebx]
  348.     add     eax, ecx
  349.     sub     eax, 48
  350.     inc     ebx
  351.     inc     [exp_pos]
  352.     jmp     @b
  353.   @@:
  354.     ret
  355.  endp
  356.  
  357.  ; ---------------------------
  358.  
  359.  proc skip_spaces uses ebx
  360.     mov     ebx, exp
  361.     add     ebx, [exp_pos]
  362.   @@:
  363.     cmp     [ebx], byte " "
  364.     jne     @f
  365.     inc     ebx
  366.     inc     [exp_pos]
  367.     jmp     @b
  368.   @@:
  369.     ret
  370.  endp
  371.  
  372.  ; ---------------------------
  373.  
  374.  proc c_power uses ebx
  375.     mov     ebx, eax
  376.     mov     eax, 1
  377.   @@:
  378.     cmp     ebx, 0
  379.     je      @f
  380.     imul    eax, ecx
  381.     dec     ebx
  382.     jmp     @b
  383.   @@:
  384.     ret
  385.  endp
  386.  
  387.  ; ---------------------------
  388.  
  389.  proc convert_to_str uses ebx ecx edx esi edi, _num, _str
  390.     mov     eax, [_num]
  391.     mov     esi, [_str]
  392.     mov     edi, 0
  393.     mov     ecx, eax
  394.     and     ecx, 1 shl 31
  395.     cmp     ecx, 0
  396.     je      @f
  397.     mov     [esi], byte "-"
  398.     inc     esi
  399.     inc     edi
  400.     not     eax
  401.     inc     eax
  402.   @@:
  403.     mov     ebx, 10
  404.     xor     ecx, ecx
  405.   @@:
  406.     xor     edx, edx
  407.     div     ebx
  408.     push    edx
  409.     inc     ecx
  410.     inc     edi
  411.     cmp     eax, 0
  412.     jne     @b
  413.   @@:
  414.     pop     eax
  415.     add     al, "0"
  416.     mov     [esi], al
  417.     inc     esi
  418.     loop    @b
  419.     mov     [esi], byte 0
  420.     mov     eax, edi
  421.     ret
  422.  endp