%include "mine.inc"

global main
extern printf

         section .text


;================================================================================
; Get the args from the command line -- which should include only the file name.
;================================================================================
GetCommandLine:

         Enter 0
         Push_Regs ebx, ecx, edx

; Write NULL into the filename pointer arg given on the stack so the caller 
; (main) can exit with an error. 

         mov ebx, [ebp + 8]
         mov [ebx], dword 0

; Get argument count. Remember I pushed an arg and the return address and ebp are 
; at the top of the stack -- so argc is at offset 16 and an pointer to an array
; of pointers at 20. The first element is the program name. The other args are
; at positions 2 through n. In our case, only one arg is given -- the data file
; name. THIS ASSUMES gcc is used to link -- when ld is used, the stack is set up
; differently (see the nasm slides).

         mov ecx, [ebp + 16]

Make_Local_Str temp_gcl1_len, temp_gcl1_str, 'Argument count is %d', 10, 0
C_Sys_Call printf, 2, temp_gcl1_str, ecx
%ifdef DEBUG
%endif

; Check the value of argc. It should be exactly 2 -- which includes the program
; name and the data file name. 

         cmp ecx, 2
         if ne
            jmp gcl_done
         endif
         
mov ecx, [ebp + 20]
mov ebx, [ecx]
Make_Local_Str temp_gcl2_len, temp_gcl2_str, 'Program name is %s', 10, 0
C_Sys_Call printf, 2, temp_gcl2_str, ebx
%ifdef DEBUG
%endif

         mov ecx, [ebp + 20]
         mov ebx, [ecx + 4]

Make_Local_Str temp_gcl3_len, temp_gcl3_str, 'Filename is %s', 10, 0
C_Sys_Call printf, 2, temp_gcl3_str, ebx
%ifdef DEBUG
%endif

; Set the filename pointer arg on the stack to the address of the filename,
; also on the stack but at a different position.

         mov edx, [ebp + 8]
         mov [edx], ebx

gcl_done:

         Pop_Regs ebx, ecx, edx
         Leave
         ret


;================================================================================
;===================================== MAIN =====================================
;================================================================================

   section .data
input_filename_ptr:  dd 0

   section .text
main:
         push dword input_filename_ptr
         call GetCommandLine
         add esp, 4

; Check the filename for NULL and exit if so.

         cmp [input_filename_ptr], dword 0
         if e
            Make_Local_Str no_filename_len, no_filename_str, 'NULL filename ! Usage "mine filename"', 10, 0
            C_Sys_Call printf, 1, no_filename_str
            Sys_Exit -1
         endif

; REMEMBER -- IN THE CALL TO open -- YOU MUST DEREFERENCE [input_filename_ptr] SINCE
; input_filename_ptr IS A POINTER CONTAINING THE ADDRESS OF THE COMMAND LINE 
; FILENAME STRING.

