home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / FFUN.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  7KB  |  147 lines

  1. ;//////////////////////////////////////////////////////
  2. ;/                                                    /
  3. ;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
  4. ;/ Routinen für Dateien.                              /
  5. ;/                                                    /
  6. ;/ 1993 Matthias Withopf / c't                        /
  7. ;/ Originalversion (c) 1988,92 Borland International  /
  8. ;/                                                    /
  9. ;//////////////////////////////////////////////////////
  10.  
  11.                 .286p                                         
  12.  
  13.                 _NOMACROS_ = 1                  ; keine Macros definieren
  14.                 INCLUDE SE.ASM
  15.                 INCLUDE OS2.ASM
  16.  
  17. DATA            SEGMENT WORD PUBLIC
  18.                 EXTRN   InOutRes:WORD
  19. DATA            ENDS
  20.  
  21. CODE            SEGMENT BYTE PUBLIC
  22.                 ASSUME  CS:CODE,DS:DATA
  23.                 EXTRN   LongDiv:NEAR
  24.                 EXTRN   ConvErrCode:NEAR
  25.  
  26.                 ;
  27.                 ; Function FilePos(Var f) : LongInt;
  28.                 ;
  29.  
  30.                 PUBLIC  GetFPos
  31. GetFPos         PROC    PASCAL FAR
  32.                 ARG     A_FileP    : DWORD
  33.                 LOCAL   L_FilePos  : DWORD, \
  34.                         L_FileSize : DWORD
  35.                 CALL    FileData                ; lese Position des Dateizeigers
  36.                 JC      Exit                    ; falls Fehler -> Ende
  37. GetPosSize:     MOV     CX,ES:[DI].fBufSize     ; lese Record-Größe
  38.                 CMP     CX,1                    ; ist es 1-Byte-Record ?
  39.                 JE      Exit                    ; ja -> Ende
  40.                 XOR     BX,BX                   ; anderenfalls dividiere die 
  41.                 PUSH    CS                      ; Position des Dateizeigers 
  42.                 CALL    LongDiv                 ; durch die Record-Größe
  43. Exit:           RET
  44. GetFPos         ENDP
  45.  
  46.                 ;
  47.                 ; Function FileSize(Var f) : LongInt;
  48.                 ;
  49.  
  50.                 PUBLIC  GetFSize
  51. GetFSize        PROC    PASCAL FAR
  52.                 ARG     A_FileP    : DWORD
  53.                 LOCAL   L_FilePos  : DWORD, \
  54.                         L_FileSize : DWORD
  55.                 CALL    FileData                ; lese Größe der Datei
  56.                 JC      Exit                    ; falls Fehler -> Ende
  57.                 MOV     AX,CX                   ; lese Dateigröße
  58.                 MOV     DX,BX                   ; in DX:AX
  59.                 JMP     GetPosSize              ; berechne Dateigröße in Records
  60. GetFSize        ENDP
  61.  
  62.                 ;
  63.                 ; Function Eof(Var f) : Boolean;
  64.                 ;
  65.  
  66.                 PUBLIC  GetFEof
  67. GetFEof         PROC    PASCAL FAR
  68.                 ARG     A_FileP    : DWORD
  69.                 LOCAL   L_FilePos  : DWORD, \
  70.                         L_FileSize : DWORD
  71.                 CALL    FileData                ; lese Position des Dateizeigers und Dateigröße
  72.                 JC      @@False                 ; falls Fehler -> gebe False zurück
  73.                 SUB     AX,CX                   ; ist Dateigröße größer
  74.                 SBB     DX,BX                   ; als Position des Dateizeigers ?
  75.                 JC      @@False                 ; ja -> weiter
  76.                 MOV     AL,1                    ; Ergebnis := True
  77.                 RET
  78.  
  79. @@False:        XOR     AL,AL                   ; Ergebnis := False
  80.                 RET
  81.  
  82.                 ;
  83.                 ; Erfrage Position des Dateizeigers (DX:AX) und
  84.                 ; Dateigröße (BX:CX). Carry ist bei Fehler gesetzt.
  85.                 ;
  86.  
  87. FileData        PROC    NEAR
  88.                 LES     DI,A_FileP              ; lese Zeiger auf FileRec
  89.                 CMP     ES:[DI].fMode,fmInOut   ; ist Datei offen ?
  90.                 JNE     @@Error                 ; nein -> Fehler
  91.                 PUSH    ES:[DI].fHandle         ; übergebe FileHandle
  92.                 XOR     AX,AX                   ; übergebe 0
  93.                 PUSH    AX                      ; als
  94.                 PUSH    AX                      ; Positionsangabe
  95.                 PUSH    FILE_CURRENT            ; von aktueller Position aus
  96.                 LEA     BX,L_FilePos            ; lese Zeiger auf Word, in dem 
  97.                 PUSH    SS                      ; die aktuelle Position des
  98.                 PUSH    BX                      ; Datei-Zeigers gespeichert wird
  99.                 CALL    DosChgFilePtr           ; erfrage aktuelle Position der Datei
  100.                 CALL    ConvErrCode             ; konvertiere Fehlercode nach OS/2-Code
  101.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  102.                 JNZ     @@Error1                ; ja -> Ende
  103.                 PUSH    ES:[DI].fHandle         ; übergebe FileHandle
  104.                 XOR     AX,AX                   ; übergebe 0
  105.                 PUSH    AX                      ; als
  106.                 PUSH    AX                      ; Positionsangabe
  107.                 PUSH    FILE_END                ; von Dateiende aus
  108.                 LEA     BX,L_FileSize           ; lese Zeiger auf Word, in dem 
  109.                 PUSH    SS                      ; die Dateigröße
  110.                 PUSH    BX                      ; gespeichert wird
  111.                 CALL    DosChgFilePtr           ; erfrage Dateigröße
  112.                 CALL    ConvErrCode             ; konvertiere Fehlercode nach OS/2-Code
  113.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  114.                 JNZ     @@Error1                ; ja -> Ende
  115.                 PUSH    ES:[DI].fHandle         ; bestimme Größe der Datei
  116.                 PUSH    L_FilePos.segm          ; übergebe alte Position
  117.                 PUSH    L_FilePos.offs          ; des Dateizeigers
  118.                 PUSH    FILE_BEGIN              ; von Dateiende aus
  119.                 LEA     BX,L_FilePos            ; lese Zeiger auf Word, in dem 
  120.                 PUSH    SS                      ; die aktuelle Position des
  121.                 PUSH    BX                      ; Dateizeigers gespeichert wird
  122.                 CALL    DosChgFilePtr           ; gehe wieder an alte Position
  123.                 CALL    ConvErrCode             ; konvertiere Fehlercode nach OS/2-Code
  124.                 OR      AX,AX                   ; ist Fehler aufgetreten ?
  125.                 JNZ     @@Error1                ; ja -> Ende
  126.                 MOV     DX,L_FilePos.segm       ; lese Position des Dateizeigers
  127.                 MOV     AX,L_FilePos.offs       ; in DX:AX
  128.                 MOV     BX,L_FileSize.segm      ; lese Dateigröße
  129.                 MOV     CX,L_FileSize.offs      ; in BX:CX
  130.                 CLC                             ; lösche Fehlerflag
  131.                 RET
  132.  
  133. @@Error:        MOV     AX,103                  ; Fehler: 'File not open'
  134. @@Error1:       MOV     InOutRes,AX             ; speichere Fehlercode
  135.                 XOR     AX,AX                   ; lese 0
  136.                 CWD                             ; als Dateiposition
  137.                 MOV     CX,AX                   ; lese 0
  138.                 MOV     BX,AX                   ; als Dateigröße
  139.                 STC                             ; setze Fehlerflag
  140.                 RET
  141. FileData        ENDP
  142. GetFEof         ENDP
  143.  
  144. CODE            ENDS
  145.  
  146.                 END
  147.