Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Platform-specific procedures for Linux.
  2.  
  3. ; Reallocate memory at pointer [start.buf] and size [start.allocated],
  4. ; new size is in eax.
  5. realloc:
  6.         push    ebx esi edi
  7.         mov     ecx, eax
  8.         push    ebp
  9.         kercall __NR_mmap2, 0, , PROT_READ+PROT_WRITE, MAP_PRIVATE+MAP_ANONYMOUS, -1, 0
  10.         pop     ebp
  11.         cmp     eax, 0xFFFFF000
  12.         ja      nomemory
  13.         add     [start.free], ecx
  14.         xchg    ecx, [start.allocated]
  15.         sub     [start.free], ecx
  16.         mov     edi, eax
  17.         xchg    eax, [start.buf]
  18.         shr     ecx, 2
  19.         jz      .nothing
  20.         push    ecx
  21.         mov     esi, eax
  22.         rep     movsd
  23.         pop     ecx
  24.         shl     ecx, 2
  25.         call    free_eax_ecx
  26. .nothing:
  27.         pop     edi esi ebx
  28.         ret
  29.  
  30. ; Read the next portion of input data to [start.buf].
  31. read:
  32.         mov     ecx, [start.buf]
  33.         add     ecx, [start.allocated]
  34.         mov     edx, [start.free]
  35.         sub     ecx, edx
  36.         kercall __NR_read, [start.in], ,
  37.         test    eax, eax
  38.         js      readerr
  39.         ret
  40.  
  41. ; Write output data: eax=pointer, edi=size.
  42. write:
  43.         mov     ecx, eax
  44.         kercall __NR_write, [start.out], , edi
  45.         cmp     eax, edi
  46.         jnz     writeerr
  47.         ret
  48.  
  49. ; Parse command line, open input and output files.
  50. get_params:
  51. ; 1. Initialize default streams: 0 for stdin, 1 for stdout.
  52.         inc     [start.out]
  53. ; 2. Prepare for scanning, skipping argv[0].
  54.         mov     ebx, [start.argc]
  55.         cmp     ebx, 1
  56.         jbe     .noargs
  57.         dec     ebx
  58.         lea     esi, [start.argv+4]     ; skip argv[0]
  59.         xor     edi, edi        ; no args parsed yet
  60. ; 3. Parse loop.
  61. .parse:
  62. ; 3a. Get the next argument.
  63.         lodsd
  64. ; 3b. Check whether it is a known option.
  65.         cmp     word [eax], '-e'
  66.         jnz     @f
  67.         cmp     byte [eax+2], 0
  68.         jnz     @f
  69. ; 3c. If it is, modify flags and continue the loop.
  70.         mov     [start.flags], 1        ; '-e' is given
  71.         jmp     .nextarg
  72. @@:
  73. ; 3d. Otherwise, it is a name of input or output file.
  74. ; edi keeps the count of names encountered before;
  75. ; edi = 0 means this is input file, edi = 1 - output file,
  76. ; otherwise this is third arg, which is an error
  77.         cmp     edi, 1
  78.         ja      information
  79. ; 3e. Some parameters of __NR_open differ for input and output. Setup them.
  80.         mov     ecx, O_WRONLY+O_CREAT+O_TRUNC
  81.         mov     edx, 0644o
  82.         jz      @f
  83.         mov     ecx, O_RDONLY
  84. @@:
  85. ; 3f. Open/create the file, save the handle.
  86.         push    ebx
  87.         mov     ebx, eax
  88.         kercall __NR_open
  89.         pop     ebx
  90.         test    eax, eax
  91.         js      .fileerr
  92.         mov     [start.in+edi*4], eax
  93.         inc     edi
  94. .nextarg:
  95.         dec     ebx
  96.         jnz     .parse
  97. .noargs:
  98. ; 4. End of command line reached. Return.
  99.         ret
  100. .fileerr:
  101.         test    edi, edi
  102.         jz      in_openerr
  103.         jmp     out_openerr
  104.  
  105. ; Exit, return code is in al.
  106. exit:
  107.         movzx   ebx, al
  108.         push    ebx
  109.         mov     eax, [start.buf]
  110.         test    eax, eax
  111.         jz      @f
  112.         mov     ecx, [start.allocated]
  113.         call    free_eax_ecx
  114. @@:
  115.         kercall __NR_close, [start.in]
  116.         kercall __NR_close, [start.out]
  117.         pop     ebx
  118.         kercall __NR_exit
  119.  
  120. ; Helper procedure for realloc and exit.
  121. free_eax_ecx:
  122.         mov     ebx, eax
  123.         kercall __NR_munmap
  124.         ret
  125.  
  126. ; Output the message given in esi to stderr.
  127. sayerr:
  128.         movzx   edx, byte [esi-1]
  129.         kercall __NR_write, 2, esi,
  130.         ret
  131.  
  132. ; Get environment variable esi (ebx-relative pointer) to the buffer,
  133. ; expanding it if needed.
  134. get_environment_variable:
  135.         mov     ecx, [start.argc]
  136.         lea     ecx, [start.argv+ecx*4+4]
  137. .findvar:
  138.         mov     edx, [ecx]
  139.         add     ecx, 4
  140.         test    edx, edx
  141.         jz      .notfound
  142.         push    esi
  143.         add     esi, ebx
  144. .comparename:
  145.         lodsb
  146.         cmp     al, [edx]
  147.         jnz     @f
  148.         inc     edx
  149.         jmp     .comparename
  150. @@:
  151.         pop     esi
  152.         test    al, al
  153.         jnz     .findvar
  154.         cmp     byte [edx], '='
  155.         jnz     .findvar
  156.         inc     edx
  157.         xor     eax, eax
  158. @@:
  159.         inc     eax
  160.         cmp     byte [edx+eax-1], 0
  161.         jnz     @b
  162.         stdcall alloc_in_buf, eax
  163. @@:
  164.         mov     al, [edx]
  165.         inc     edx
  166.         mov     [edi+ebx], al
  167.         inc     edi
  168.         test    al, al
  169.         jnz     @b
  170.         ret
  171. .notfound:
  172.         stdcall alloc_in_buf, 1
  173.         mov     byte [edi+ebx], 0
  174.         inc     edi
  175.         ret
  176.  
  177. ; Test whether a file with name [.testname] exists.
  178. ; Returns eax<0 if not, nonzero otherwise.
  179. test_file_exists:
  180.         push    ebx
  181.         add     ebx, [start.testname]
  182.         sub     esp, 800h
  183.         kercall __NR_stat, , esp
  184.         add     esp, 800h
  185.         pop     ebx
  186.         ret
  187.