Metropoli BBS
VIEWER: pack.asm MODE: TEXT (ASCII)
;this example uses pack_open()

include qlib.inc
include dos.inc
include string.inc
include stdio.inc
include process.inc

include data_hdr.asm

.data
  buf db 1024 dup (0)
  buf2 db 1024 dup (0)
  h dw ?
  siz dd ?
  ph dw ?  ;pack file handle
.code
main proc
  callp pack_init,256,2
  .if eax==ERROR
    callp printf,"\npack_init() failed!\n"
    callp exit,0
  .endif
  callp pack_open,"data.000"
  .if eax==ERROR
    callp printf,"\npack_open() failed!\n"
    callp exit,0
  .endif
  mov ph,ax
  callp open,"file1",0
  mov h,ax
  .if eax==ERROR
    callp printf,"\nopen(file1) failed!\n"
    callp exit,0
  .endif
  callp lseek,h,0,SEEK_SET
  callp lseek,h,1,SEEK_CUR  ;test lseeking with a pack file (skip the 1st byte)
  callp filelength,h
  mov siz,eax
  callp read,h,offset buf,132     ;filesiz=132 but we have lseek one byte over
                                   ;what will happen? pack.asm will cut it off so we
                                   ;don't start reading the next file.
  .if eax!=131
    callp printf,"error read eax=%d\n",eax
  .endif
  callp read,h,offset buf,100     ;try to read more : it will fail
  .if eax
    callp printf,"Error #2\n"
  .endif
  callp printf,offset buf
  callp eof,h
  .if eax
    callp printf,"\nEOF=true\n"
  .else
    callp printf,"\nEOF=false (bug?)\n"
  .endif
  callp printf,"\n File length of FILE1=%d\n\n",siz
  callp close,h

  callp pack_close,ph       ;you can open many pack's if you want
  .if eax==ERROR
    callp printf,"\n pack_close() failed!\n"
    callp exit,0
  .endif
  callp pack_open_hdr,"data.001",offset the_header
  .if eax==ERROR
    callp printf,"\n pack_open_hdr() failed!\n"
    callp exit,0
  .endif
  mov ph,ax

  callp open,"file2",0  ;this will fail if pack_close() above is unremed
  mov h,ax
  .if ax==ERROR
    callp printf,"\nopen(file2) failed!\n"
    callp exit,0
  .endif
  callp read,h,offset buf2,300
  callp close,h
  callp printf,offset buf2
;some xtra lseek tests
  callp lseek,h,0,SEEK_END
  callp printf," Pos 1=%i",eax
  callp lseek,h,303,SEEK_END
  callp printf," Pos 2=%i",eax
  callp lseek,h,304,SEEK_END
  callp printf," Pos 3=%i",eax
  callp lseek,h,-303,SEEK_CUR
  callp printf," Pos 4=%i",eax
  callp lseek,h,303,SEEK_SET
  callp printf," Pos 5=%i",eax
  callp lseek,h,-309,SEEK_CUR
  callp printf," Pos 6=%i",eax
  callp lseek,h,1,SEEK_END
  callp printf," Pos 7=%i",eax
  ret
main endp

end
[ RETURN TO DIRECTORY ]