home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / ASSIGN.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  7KB  |  446 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.     INCLUDE    FILEIO.ASM
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    CreateFileA:NEAR, ReadFile:NEAR, WriteFile:NEAR
  17.     EXTRN    CloseHandle:NEAR, GetStdHandle:NEAR, GetLastError:NEAR
  18.     EXTRN    SetFilePointer:NEAR, GetFileSize:NEAR, SetEndOfFile:NEAR
  19.     EXTRN    GetFileType:NEAR, SetInOutRes:NEAR
  20.     PUBLIC    _Assign, __Flush, _Flush
  21.  
  22.     .CODE
  23.  
  24. ;    FUNCTION TextIn( VAR t: Text ) : Integer;
  25.  
  26. TextIn    PROC
  27.  
  28. ; ->    EAX    Pointer to text record
  29.  
  30. ;    Make buffer empty
  31.  
  32.     XOR    EDX,EDX
  33.     MOV    [EAX].BufEnd,EDX
  34.     MOV    [EAX].BufPos,EDX
  35.  
  36. ;    ReadFile(t.Handle, t.BufPtr, t.BufSize, @t.BufEnd, Nil);
  37.  
  38.     PUSH    EDX            ; pass lpOverLapped
  39.     LEA    EDX,[EAX].BufEnd    ; pass lpNumberOfBytesRead
  40.     PUSH    EDX
  41.     PUSH    [EAX].BufSize        ; pass nNumberOfBytestoRead
  42.     PUSH    [EAX].BufPtr        ; pass lpBuffer
  43.     PUSH    [EAX].Handle        ; pass hFile
  44.     CALL    ReadFile
  45.     TEST    EAX,EAX            ; result FALSE means error
  46.     JZ    @@error
  47.     XOR    EAX,EAX
  48.  
  49.     RET
  50.  
  51. @@error:                ; return extended error code
  52.     CALL    GetLastError
  53.     RET
  54.  
  55. TextIn    ENDP
  56.  
  57.  
  58. ;    PROCEDURE TextNullProc( VAR t: Text );
  59.  
  60. TextNullProc PROC
  61.  
  62. ; ->    EAX    Pointer to text record
  63.  
  64.     XOR    EAX,EAX            ; signal success
  65.  
  66.     RET
  67.  
  68. TextNullProc ENDP
  69.  
  70.  
  71. ;    PROCEDURE TextOut( VAR t: Text );
  72.  
  73. TextOut    PROC
  74.  
  75. ; ->    EAX    Pointer to text record
  76.  
  77. ;       WriteFile(t.Handle, t.BufPtr, t.BufPos, @dummy, Nil);
  78.  
  79.     PUSH    ECX            ; VAR dummy: Longint;
  80.  
  81.     MOV    EDX,[EAX].BufPos
  82.     TEST    EDX,EDX
  83.     JLE    @@skip
  84.  
  85.     XOR    ECX,ECX
  86.     MOV    [EAX].BufPos,ECX
  87.  
  88.     PUSH    ECX            ; pass lpOverLapped
  89.     LEA     ECX,[ESP+4]        ; pass lpNumberOfBytes written
  90.     PUSH    ECX
  91.     PUSH    EDX            ; pass nNumberOfBytesToWrite
  92.     PUSH    [EAX].BufPtr        ; pass lpBuffer
  93.     PUSH    [EAX].Handle        ; pass hFile
  94.     CALL    WriteFile
  95.     TEST    EAX,EAX
  96.     JZ    @@error
  97.  
  98. @@skip:
  99.     XOR    EAX,EAX
  100.  
  101. @@exit:
  102.     POP    ECX            ; deallocate dummy
  103.     RET
  104.  
  105. @@error:                ; return dos error code or 0
  106.     Call    GetLastError
  107.     JMP    @@exit
  108.  
  109. TextOut    ENDP
  110.  
  111.  
  112. ;    PROCEDURE TextClose( VAR t: Text );
  113.  
  114. TextClose PROC
  115.  
  116. ; ->    EAX    Pointer to text record
  117.  
  118. ;    CloseHandle( t.Handle );
  119.  
  120.     PUSH    [EAX].Handle
  121.     MOV    [EAX].Mode,fmClosed
  122.     CALL    CloseHandle
  123.     DEC    EAX
  124.     JNZ    @@error
  125.     RET
  126. @@error:
  127.     CALL    GetLastError
  128.     RET
  129.  
  130. TextClose ENDP
  131.  
  132.  
  133. ;    PROCEDURE TextOpen( VAR t: Text );
  134.  
  135. TextOpen PROC
  136.  
  137. ; ->    EAX    Pointer to text record
  138.  
  139. ;
  140.     PUSH    ESI
  141.  
  142.     MOV    ESI,EAX
  143.  
  144.     XOR    EAX,EAX
  145.     MOV    [ESI].BufPos,EAX
  146.     MOV    [ESI].BufEnd,EAX
  147.     MOV    EAX,[ESI].Mode
  148.  
  149.     SUB    EAX,fmInput
  150.     JE    @@calledByReset
  151.  
  152.     DEC    EAX
  153.     JE    @@calledByRewrite
  154.  
  155.     DEC    EAX
  156.     JE    @@calledByAppend
  157.  
  158.     JMP    @@exit
  159.  
  160. @@calledByReset:
  161.  
  162.     MOV    EAX,GENERIC_READ            ; open for read
  163.     MOV    EDX,FILE_SHARE_WRITE
  164.     MOV    ECX,OPEN_EXISTING
  165.  
  166.     MOV    [ESI].InOutFunc,offset TextIn
  167.  
  168.     JMP    @@common
  169.  
  170. @@calledByRewrite:
  171.  
  172.     MOV    EAX,GENERIC_WRITE            ; open for write
  173.     MOV    EDX,FILE_SHARE_READ
  174.     MOV    ECX,CREATE_ALWAYS
  175.     JMP    @@commonOut
  176.  
  177. @@calledByAppend:
  178.  
  179.     MOV    EAX,GENERIC_READ OR GENERIC_WRITE    ; open for read/write
  180.     MOV    EDX,FILE_SHARE_READ
  181.     MOV    ECX,OPEN_EXISTING
  182.  
  183. @@commonOut:
  184.  
  185.     MOV    [ESI].InOutFunc,offset TextOut
  186.  
  187. @@common:
  188.  
  189.     MOV    [ESI].CloseFunc,offset TextClose
  190.     MOV    [ESI].FlushFunc,offset TextNullProc
  191.     CMP    byte ptr [ESI].FileName,0
  192.     JE    @@isCon
  193.  
  194. ;    CreateFile(t.FileName, EAX, EDX, Nil, ECX, FILE_ATTRIBUTE_NORMAL, 0);
  195.  
  196.     PUSH    0
  197.     PUSH    FILE_ATTRIBUTE_NORMAL
  198.     PUSH    ECX
  199.     PUSH    0
  200.     PUSH    EDX
  201.     PUSH    EAX
  202.     LEA    EAX,[ESI].FileName
  203.     PUSH    EAX
  204.     CALL    CreateFileA
  205.  
  206.     CMP    EAX,-1
  207.     JZ    @@error
  208.  
  209.     MOV    [ESI].Handle,EAX
  210.     CMP    [ESI].Mode,fmInOut
  211.     JNE    @@success
  212.  
  213.     DEC    [ESI].Mode            ; fmInOut -> fmOutput
  214.  
  215. ;    ???  we really have to look for the first eof byte in the
  216. ;    ???  last record and truncate the file there.
  217. ;    Not very nice and clean...
  218. ;
  219. ;    lastRecPos = Max( GetFileSize(...) - 128, 0);
  220.  
  221.     PUSH    0
  222.     PUSH    [ESI].Handle
  223.     CALL    GetFileSize
  224.  
  225.     INC    EAX
  226.     JZ    @@error
  227.     SUB    EAX,129
  228.     JNC    @@3
  229.     XOR    EAX,EAX
  230. @@3:
  231. ;    lseek(f.Handle, SEEK_SET, lastRecPos);
  232.  
  233.     PUSH    FILE_BEGIN
  234.     PUSH    0
  235.     PUSH    EAX
  236.     PUSH    [ESI].Handle
  237.     CALL    SetFilePointer
  238.  
  239.     INC    EAX
  240.     JE    @@error
  241.  
  242. ;    bytesRead = read(f.Handle, f.Buffer, 128);
  243.  
  244.     PUSH    0
  245.     MOV    EDX,ESP
  246.     PUSH    0
  247.     PUSH    EDX
  248.     PUSH    128
  249.     LEA    EDX,[ESI].Buffer
  250.     PUSH    EDX
  251.     PUSH    [ESI].Handle
  252.     CALL    ReadFile
  253.     POP    EDX
  254.     DEC    EAX
  255.     JNZ    @@error
  256.  
  257. ;    for    (i = 0; i < bytesRead; i++)
  258.  
  259.     XOR    EAX,EAX
  260. @@loop:
  261.     CMP    EAX,EDX
  262.     JAE    @@success
  263.  
  264. ;        if    (f.Buffer[i] == eof)
  265.  
  266.     CMP    byte ptr [ESI].Buffer[EAX],eof
  267.     JE    @@truncate
  268.     INC    EAX
  269.     JMP    @@loop
  270.  
  271. @@truncate:
  272.  
  273. ;    lseek( f.Handle, SEEK_END, i - bytesRead );
  274.  
  275.     PUSH    FILE_END
  276.     PUSH    0
  277.     SUB    EAX,EDX
  278.     PUSH    EAX
  279.     PUSH    [ESI].Handle
  280.     CALL    SetFilePointer
  281.     INC    EAX
  282.     JE    @@error
  283.  
  284. ;    SetEndOfFile( f.Handle );
  285.  
  286.     PUSH    [ESI].Handle
  287.     CALL    SetEndOfFile
  288.     DEC    EAX
  289.     JNE    @@error
  290.  
  291.     JMP    @@success
  292.  
  293. @@isCon:
  294.     MOV    [ESI].CloseFunc,offset TextNullProc
  295.     CMP    [ESI].Mode,fmOutput
  296.     JE    @@output
  297.     PUSH    STD_INPUT_HANDLE
  298.     JMP    @@1
  299. @@output:
  300.     PUSH    STD_OUTPUT_HANDLE
  301. @@1:
  302.     CALL    GetStdHandle
  303.     CMP    EAX,-1
  304.     JE    @@error
  305.     MOV    [ESI].Handle,EAX
  306.  
  307. @@success:
  308.     CMP    [ESI].Mode,fmInput
  309.     JE    @@2
  310.     PUSH    [ESI].Handle
  311.     CALL    GetFileType
  312.         TEST    EAX,EAX
  313.         JE      @@badFileType
  314.     CMP    EAX,2
  315.     JNE    @@2
  316.     MOV    [ESI].FlushFunc,offset TextOut
  317. @@2:
  318.     XOR    EAX,EAX
  319. @@exit:
  320.     POP    ESI
  321.     RET
  322.  
  323. @@badFileType:
  324.         PUSH    [ESI].Handle
  325.         CALL    CloseHandle
  326.     MOV    [ESI].Mode,fmClosed
  327.         MOV     EAX,105
  328.         JMP     @@exit
  329.  
  330. @@error:
  331.     MOV    [ESI].Mode,fmClosed
  332.     CALL    GetLastError
  333.     JMP    @@exit
  334.  
  335. TextOpen ENDP
  336.  
  337.  
  338. ;    PROCEDURE _Assign( VAR t: Text; s: PChar );
  339.  
  340. _Assign    PROC
  341.  
  342. ; ->    EAX    Pointer to text record
  343. ;    EDX    Pointer to file name
  344.  
  345. ;    we just initialize the various fields
  346.  
  347.     LEA    ECX,[EAX].Buffer
  348.     MOV    [EAX].BufPtr,ECX
  349.     XOR    ECX,ECX
  350.     MOV    [EAX].Handle,ECX
  351.     MOV    [EAX].Mode,fmClosed
  352.     MOV    [EAX].BufSize,128
  353.     MOV    [EAX].BufPos,ECX
  354.     MOV    [EAX].BufEnd,ECX
  355.     MOV    [EAX].OpenFunc,offset TextOpen
  356.     MOV    [EAX].InOutFunc,ECX
  357.     MOV    [EAX].FlushFunc,ECX
  358.     MOV    [EAX].CloseFunc,ECX
  359.  
  360. ;    and copy the file name, truncating it to fNameLen-1 chars
  361.  
  362.     LEA    EAX,[EAX].FileName
  363.  
  364.     TEST    EDX,EDX
  365.     JE    @@term
  366.  
  367.     MOV    CH,fNameLen / 2
  368.  
  369. @@loop:
  370.     MOV    CL,[EDX]
  371.     INC    EDX
  372.     MOV    [EAX],CL
  373.     INC    EAX
  374.     TEST    CL,CL
  375.     JE    @@exit
  376.  
  377.     MOV    CL,[EDX]
  378.     INC    EDX
  379.     MOV    [EAX],CL
  380.     INC    EAX
  381.     TEST    CL,CL
  382.     JE    @@exit
  383.  
  384.     DEC    CH
  385.     JNE    @@loop
  386.     DEC    EAX
  387. @@term:
  388.     MOV    [EAX],CH
  389. @@exit:
  390.     RET
  391.  
  392. _Assign    ENDP
  393.  
  394.  
  395. ;    PROCEDURE Flush( VAR f: Text );
  396.  
  397. __Flush    PROC
  398.  
  399. ; ->    EAX    Pointer to text record
  400.  
  401.     MOV    EDX,[EAX].Mode
  402.     CMP    EDX,fmOutput
  403.     JNE    @@fileNotOutput
  404.     CALL    [EAX].InOutFunc
  405.     TEST    EAX,EAX
  406.     JNE    @@error
  407. @@exit:
  408.     RET
  409.  
  410. @@fileNotOutput:
  411.     CMP    EDX,fmInput
  412.     JE    @@exit
  413.     MOV    EAX,103
  414. @@error:
  415.     JMP    SetInOutRes
  416.  
  417.  
  418. __Flush    ENDP
  419.  
  420. ;    PROCEDURE _Flush( VAR f: Text );
  421.  
  422. _Flush    PROC
  423.  
  424. ; ->    EAX    Pointer to text record
  425.  
  426.     MOV    EDX,[EAX].Mode
  427.     CMP    EDX,fmOutput
  428.     JNE    @@fileNotOutput
  429.     CALL    [EAX].FlushFunc
  430.     TEST    EAX,EAX
  431.     JNE    @@error
  432. @@exit:
  433.     RET
  434.  
  435. @@fileNotOutput:
  436.     CMP    EDX,fmInput
  437.     JE    @@exit
  438.     MOV    EAX,103
  439. @@error:
  440.     JMP    SetInOutRes
  441.  
  442. _Flush    ENDP
  443.  
  444.     END
  445.  
  446.