From 7109c7df98fb240fff28b7122192808839236f5a Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 9 Aug 2002 10:40:43 +0000 Subject: [PATCH] added fcb_parsename Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@129 --- include/dos_inc.h | 1 + src/dos/dos.cpp | 33 +++++++------ src/dos/dos_files.cpp | 109 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 120 insertions(+), 23 deletions(-) diff --git a/include/dos_inc.h b/include/dos_inc.h index e3e79cf8..353ce7c0 100644 --- a/include/dos_inc.h +++ b/include/dos_inc.h @@ -201,6 +201,7 @@ bool DOS_FCBOpen(Bit16u seg,Bit16u offset); bool DOS_FCBClose(Bit16u seg,Bit16u offset); bool DOS_FCBFindFirst(Bit16u seg,Bit16u offset); bool DOS_FCBFindNext(Bit16u seg,Bit16u offset); +Bit8u FCB_Parsename(Bit16u seg,Bit16u offset,Bit8u parser ,char *string, Bit8u *change); /* Extra DOS Interrupts */ void DOS_SetupMisc(void); diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 1f207caf..b99d2171 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -178,24 +178,27 @@ static Bitu DOS_21Handler(void) { }else{ reg_al=0xff; } - LOG_DEBUG("DOS:0x0f FCB-fileclose used"); + LOG_DEBUG("DOS:0x10 FCB-fileclose used"); break; + case 0x11: /* Find First Matching File using FCB */ if(DOS_FCBFindFirst(Segs[ds].value,reg_dx)){ reg_al=0; }else{ reg_al=0xff; } - LOG_DEBUG("DOS:0x0f FCB-FindFirst used"); + LOG_DEBUG("DOS:0x11 FCB-FindFirst used"); break; + case 0x12: /* Find Next Matching File using FCB */ if(DOS_FCBFindNext(Segs[ds].value,reg_dx)){ reg_al=0; }else{ reg_al=0xff; } - LOG_DEBUG("DOS:0x0f FCB-FindNext used"); + LOG_DEBUG("DOS:0x12 FCB-FindNext used"); break; + case 0x13: /* Delete File using FCB */ case 0x14: /* Sequential read from FCB */ case 0x15: /* Sequential write to FCB */ @@ -211,21 +214,17 @@ static Bitu DOS_21Handler(void) { reg_al=0xff; /* FCB Calls FAIL */ //CALLBACK_SCF(true); not needed. break; + case 0x29: /* Parse filename into FCB */ -//TODO Give errors for unsupported functions - { - MEM_StrCopy(real_phys(Segs[ds].value,reg_si),name1,DOSNAMEBUF); -/* only detect the call program use to detect the existence of a harddisk */ - if ((strlen((char *)name1)==2) && (name1[1]==':')) { - Bit8u drive=toupper(name1[0])-'A'; - if (Drives[drive]) reg_al=0; - else reg_al=0xff; - break; - } - LOG_DEBUG("DOS:29:FCB Parse Filename:%s",name1); - }; - reg_al=0xff; /* FCB Calls FAIL */ - break; + { Bit8u difference; + char string[1024]; + MEM_StrCopy(Real2Phys(RealMake(Segs[ds].value,reg_si)) ,string,1024); + reg_al=FCB_Parsename(Segs[es].value,reg_di,reg_al ,string, &difference); + reg_di+=difference; + } + LOG_DEBUG("DOS:29:FCB Parse Filename result:%d",reg_al); + break; + case 0x18: /* NULL Function for CP/M compatibility or Extended rename FCB */ case 0x1d: /* NULL Function for CP/M compatibility or Extended rename FCB */ case 0x1e: /* NULL Function for CP/M compatibility or Extended rename FCB */ diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index bcd4c4ff..1f28624d 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -471,8 +471,96 @@ static bool FCB_MakeName (DOS_FCB* fcb, char* outname, Bit8u* outdrive){ strcat(naam,ext); return DOS_MakeName(naam,outname, outdrive); } +#define FCB_SEP ":.;,=+" +#define ILLEGAL ":.;,=+ \t/\"[]<>|\0x0\0x1\0x2\0x3\0x4\0x5\0x6\0x7\0x8\0x9\0xA\0xB\0xC\0xD\0xE\0xF\0x10\0x11\0x12\0x13\0x14\0x15\0x16\0x17\0x18x\0x19\0x1A\0x1B\0x1C\0x1D\0x1E\0x1F" + +static bool isvalid(const char* in){ + char ill[]=ILLEGAL; + char a[2]; + a[0]=*in;a[1]='\0'; + if(strcspn(a,ill)==0) return false; + return true; + +} + +static void vullen (char* veld,char* pveld){ + for(Bitu i=(pveld-veld);i'Z') | (drive<'A') ) { + *change=string-backup; + return 0xFF; + } + fcb.Set_drive(drive-'A'+1); + string+=2; + } + //startparsing + char* pnaam=naam; + while(isvalid(string)==true) { + if(*string=='*'){ + vullen(naam,pnaam); //fill with ???? + string++; + retwaarde=1; + break; + } + + *pnaam=*string; + pnaam++; + string++; + } + fcb.Set_filename(naam); + if((*string=='.')==false) { + *change=string-backup; + return retwaarde; + } + //extension exist + string++; + char* pext=ext; + while(isvalid(string)==true) { + if(*string=='*'){ + vullen(ext,pext); //fill with ???? + string++; + retwaarde=1; + break; + } + + *pext=*string; + pext++; + string++; + } + fcb.Set_ext(ext); + *change=string-backup; + return retwaarde; + +} bool DOS_FCBOpen(Bit16u seg,Bit16u offset) { DOS_FCB fcb(seg,offset); Bit8u drive; @@ -487,6 +575,7 @@ bool DOS_FCBOpen(Bit16u seg,Bit16u offset) { fcb.Set_current_block(constant); constant=0x80; fcb.Set_record_size(constant); + struct tm *time; if((time=localtime(&stat_block.st_mtime))!=0){ @@ -522,10 +611,13 @@ bool DOS_FCBFindFirst(Bit16u seg,Bit16u offset) char fullname[DOS_PATHLENGTH]; FCB_MakeName (fcb, fullname, &drive); DTA_FindBlock * dtablock=(DTA_FindBlock *)Real2Host(dos.dta); + dtablock->sattr=DOS_ATTR_ARCHIVE; + dtablock->sdrive=drive; + if(Drives[drive]->FindFirst(fullname,dtablock)==false) return false; - char naam[8]; - char ext[3]; + char naam[9]; + char ext[4]; char * point=strrchr(dtablock->name,'.'); if(point==NULL|| *(point+1)=='\0') { ext[0]=' '; @@ -542,7 +634,8 @@ bool DOS_FCBFindFirst(Bit16u seg,Bit16u offset) strcpy (naam,dtablock->name); i=strlen(dtablock->name); while(i!=8) {naam[i]=' '; i++;} - DOS_FCB* fcbout= new DOS_FCB((PhysPt)Real2Host(dos.dta)); + delete fcb; + DOS_FCB* fcbout= new DOS_FCB((PhysPt)Real2Phys(dos.dta)); fcbout->Set_drive(drive +1); fcbout->Set_filename(naam); fcbout->Set_ext(ext); @@ -557,9 +650,12 @@ bool DOS_FCBFindNext(Bit16u seg,Bit16u offset) char fullname[DOS_PATHLENGTH]; FCB_MakeName (fcb, fullname, &drive); DTA_FindBlock * dtablock=(DTA_FindBlock *)Real2Host(dos.dta); + dtablock->sattr=DOS_ATTR_ARCHIVE; + dtablock->sdrive=drive; + if(Drives[dtablock->sdrive]->FindNext(dtablock)==false) return false; - char naam[8]; - char ext[3]; + char naam[9]; + char ext[4]; char * point=strrchr(dtablock->name,'.'); if(point==NULL|| *(point+1)=='\0') { ext[0]=' '; @@ -577,7 +673,8 @@ bool DOS_FCBFindNext(Bit16u seg,Bit16u offset) strcpy (naam,dtablock->name); i=strlen(dtablock->name); while(i!=8) {naam[i]=' '; i++;} - DOS_FCB* fcbout= new DOS_FCB((PhysPt)Real2Host(dos.dta)); + delete fcb; + DOS_FCB* fcbout= new DOS_FCB(Real2Phys(dos.dta)); fcbout->Set_drive(drive +1); fcbout->Set_filename(naam); fcbout->Set_ext(ext);