Seek changes:

* merge unstable kernel optimizations
* enable seek for int2f/AX=1228
* -1 is a valid offset, so we need to process the return code seperately


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1429 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2009-06-09 18:50:03 +00:00
parent 288a2f396b
commit e0ca8d76e2
4 changed files with 32 additions and 41 deletions

View File

@ -129,7 +129,7 @@ typedef struct sfttbl {
#define SFT_FCONOUT 0x0002 /* device is console output */ #define SFT_FCONOUT 0x0002 /* device is console output */
#define SFT_FCONIN 0x0001 /* device is console input */ #define SFT_FCONIN 0x0001 /* device is console input */
/* Covienence defines */ /* Convenience defines */
#define sft_dcb sft_dcb_or_dev._sft_dcb #define sft_dcb sft_dcb_or_dev._sft_dcb
#define sft_dev sft_dcb_or_dev._sft_dev #define sft_dev sft_dcb_or_dev._sft_dev
@ -137,3 +137,7 @@ typedef struct sfttbl {
#define sft_flags_hi sft_flags_union._split_sft_flags._sft_flags_hi #define sft_flags_hi sft_flags_union._split_sft_flags._sft_flags_hi
#define sft_flags_lo sft_flags_union._split_sft_flags._sft_flags_lo #define sft_flags_lo sft_flags_union._split_sft_flags._sft_flags_lo
/* defines for LSEEK */
#define SEEK_SET 0u
#define SEEK_CUR 1u
#define SEEK_END 2u

View File

@ -305,14 +305,14 @@ long DosRWSft(int sft_idx, size_t n, void FAR * bp, int mode)
} }
} }
COUNT SftSeek(int sft_idx, LONG new_pos, COUNT mode) COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode)
{ {
sft FAR *s = idx_to_sft(sft_idx); sft FAR *s = idx_to_sft(sft_idx);
if (FP_OFF(s) == (size_t) -1) if (FP_OFF(s) == (size_t) -1)
return DE_INVLDHNDL; return DE_INVLDHNDL;
/* Test for invalid mode */ /* Test for invalid mode */
if (mode < 0 || mode > 2) if (mode > SEEK_END)
return DE_INVLDFUNC; return DE_INVLDFUNC;
lpCurSft = s; lpCurSft = s;
@ -320,12 +320,13 @@ COUNT SftSeek(int sft_idx, LONG new_pos, COUNT mode)
/* Do special return for character devices */ /* Do special return for character devices */
if (s->sft_flags & SFT_FDEVICE) if (s->sft_flags & SFT_FDEVICE)
{ {
s->sft_posit = 0l; new_pos = 0;
return SUCCESS;
} }
else if (mode == SEEK_CUR)
/* seek from end of file */ {
if (mode == 2) new_pos += s->sft_posit;
}
else if (mode == SEEK_END) /* seek from end of file */
{ {
/* /*
* RB list has it as Note: * RB list has it as Note:
@ -339,29 +340,24 @@ COUNT SftSeek(int sft_idx, LONG new_pos, COUNT mode)
*/ */
if ((s->sft_flags & SFT_FSHARED) && if ((s->sft_flags & SFT_FSHARED) &&
(s->sft_mode & (O_DENYREAD | O_DENYNONE))) (s->sft_mode & (O_DENYREAD | O_DENYNONE)))
s->sft_posit = remote_lseek(s, new_pos); new_pos = remote_lseek(s, new_pos);
else else
s->sft_posit = s->sft_size + new_pos; new_pos += s->sft_size;
} }
else if (mode == 0)
s->sft_posit = new_pos; s->sft_posit = new_pos;
else /* mode == 1 */
s->sft_posit += new_pos;
return SUCCESS; return SUCCESS;
} }
ULONG DosSeek(unsigned hndl, LONG new_pos, COUNT mode) ULONG DosSeek(unsigned hndl, LONG new_pos, COUNT mode, int *rc)
{ {
int sft_idx = get_sft_idx(hndl); int sft_idx = get_sft_idx(hndl);
COUNT result;
/* Get the SFT block that contains the SFT */ /* Get the SFT block that contains the SFT */
result = SftSeek(sft_idx, new_pos, mode); *rc = SftSeek(sft_idx, new_pos, mode);
if (result == SUCCESS) if (*rc == SUCCESS)
{
return idx_to_sft(sft_idx)->sft_posit; return idx_to_sft(sft_idx)->sft_posit;
} return *rc;
return (ULONG)-1;
} }
STATIC long get_free_hndl(void) STATIC long get_free_hndl(void)

View File

@ -931,17 +931,14 @@ dispatch:
case 0x42: case 0x42:
if (lr.AL > 2) if (lr.AL > 2)
goto error_invalid; goto error_invalid;
lrc = DosSeek(lr.BX, (LONG)((((ULONG) (lr.CX)) << 16) | lr.DX), lr.AL); lrc = DosSeek(lr.BX, (LONG)((((ULONG) (lr.CX)) << 16) | lr.DX), lr.AL,
if (lrc == -1) &rc);
{ if (rc == SUCCESS)
lrc = DE_INVLDHNDL;
}
else
{ {
lr.DX = (UWORD)(lrc >> 16); lr.DX = (UWORD)(lrc >> 16);
lrc = (UWORD) lrc; lr.AX = (UWORD) lrc;
} }
goto long_check; goto short_check;
/* Get/Set File Attributes */ /* Get/Set File Attributes */
case 0x43: case 0x43:
@ -1957,19 +1954,13 @@ VOID ASMCFUNC int2F_12_handler(struct int2f12regs r)
CritErrCode = SUCCESS; CritErrCode = SUCCESS;
if (r.BP < 0x4200 || r.BP > 0x4202) if (r.BP < 0x4200 || r.BP > 0x4202)
goto error_invalid; goto error_invalid;
#if 0 lrc = DosSeek(r.BX, MK_ULONG(r.CX, r.DX), r.BP & 0xff, &rc);
if (rc == SUCCESS)
{ {
sft FAR *s = get_sft(r.BX); r.DX = (UWORD)(lrc >> 16);
if ((rc = _SftSeek(s, MK_ULONG(r.CX, r.DX), r.BP & 0xff)) >= SUCCESS) r.AX = (UWORD) lrc;
{
r.DX = hiword (s->sft_posit);
r.AX = loword (s->sft_posit);
}
} }
goto short_check; goto short_check;
#else
goto error_invalid;
#endif
case 0x29: /* read from file */ case 0x29: /* read from file */
r.FLAGS &= ~FLG_CARRY; r.FLAGS &= ~FLG_CARRY;

View File

@ -80,14 +80,14 @@ const char FAR *get_root(const char FAR *);
BOOL check_break(void); BOOL check_break(void);
UCOUNT GenericReadSft(sft far * sftp, UCOUNT n, void FAR * bp, UCOUNT GenericReadSft(sft far * sftp, UCOUNT n, void FAR * bp,
COUNT * err, BOOL force_binary); COUNT * err, BOOL force_binary);
COUNT SftSeek(int sft_idx, LONG new_pos, COUNT mode); COUNT SftSeek(int sft_idx, LONG new_pos, unsigned mode);
/*COUNT DosRead(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err); */ /*COUNT DosRead(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err); */
void BinarySftIO(int sft_idx, void *bp, int mode); void BinarySftIO(int sft_idx, void *bp, int mode);
#define BinaryIO(hndl, bp, mode) BinarySftIO(get_sft_idx(hndl), bp, mode) #define BinaryIO(hndl, bp, mode) BinarySftIO(get_sft_idx(hndl), bp, mode)
long DosRWSft(int sft_idx, size_t n, void FAR * bp, int mode); long DosRWSft(int sft_idx, size_t n, void FAR * bp, int mode);
#define DosRead(hndl, n, bp) DosRWSft(get_sft_idx(hndl), n, bp, XFR_READ) #define DosRead(hndl, n, bp) DosRWSft(get_sft_idx(hndl), n, bp, XFR_READ)
#define DosWrite(hndl, n, bp) DosRWSft(get_sft_idx(hndl), n, bp, XFR_WRITE) #define DosWrite(hndl, n, bp) DosRWSft(get_sft_idx(hndl), n, bp, XFR_WRITE)
ULONG DosSeek(unsigned hndl, LONG new_pos, COUNT mode); ULONG DosSeek(unsigned hndl, LONG new_pos, COUNT mode, int *rc);
long DosOpen(char FAR * fname, unsigned flags, unsigned attrib); long DosOpen(char FAR * fname, unsigned flags, unsigned attrib);
COUNT CloneHandle(unsigned hndl); COUNT CloneHandle(unsigned hndl);
long DosDup(unsigned Handle); long DosDup(unsigned Handle);