X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Trace-PostClient-IP: 68.147.177.20 From: Brian Inglis Newsgroups: comp.os.msdos.djgpp Subject: Re: intdos question Organization: Systematic Software Message-ID: References: X-Newsreader: Forte Agent 1.93/32.576 English (American) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 96 Date: Fri, 14 Jan 2005 18:25:32 GMT NNTP-Posting-Host: 24.71.223.147 X-Complaints-To: abuse AT shaw DOT ca X-Trace: pd7tw1no 1105727132 24.71.223.147 (Fri, 14 Jan 2005 11:25:32 MST) NNTP-Posting-Date: Fri, 14 Jan 2005 11:25:32 MST To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com On Fri, 14 Jan 2005 16:45:08 GMT in comp.os.msdos.djgpp, "Mike C" wrote: >Can somebody please point me in the right direction? > >I have written a parser, which parses a source file and creates a >destination file. > >To operate the program, I select the source file in Windows explorer and >drag it onto a shortcut to my program. This leaves the path to the source >file in argv[1]. My problem is that the string that I find in argv[1] is >all in DOS 8.3 format. I would like to name the destination file the same >as the source file, with a long filename, changing only the extension. > >As I know the short filename, I thought of using findfirst() and findnext() >to locate the long filenames, then generate the short filename for each one >and compare it to the known short filename. Simple in concept! > >I have been looking at Ralph Brown's interrupt list, int21, AX=7160. > >It says : > >AX = 7160h >CL = 00h >CH = SUBST expansion flag > 00h return a path containing true path for a SUBSTed drive letter > 80h return a path containing the SUBSTed drive letter >DS:SI -> ASCIZ filename or path (either long name or short name) >ES:DI -> 261-byte buffer for canonicalized name > >Return:CF set on error >AX = error code > 02h invalid component in directory path or drive letter only > 03h malformed path or invalid drive letter >ES:DI buffer unchanged >CF clear if successful >ES:DI buffer filled with fully qualified name >AX destroyed > >... so I guess I need to load DS:SI with a pointer to my long filename >buffer, and it will return a pointer to the short filename in ES:DI, but >that's where I get stuck. You want to go the other way from short to long, don't you? You use subfunction 2 to get the long name from the short name. >I'm not very familiar with the Intel registers. How do I get my pointer >into DS:SI? If I'm not mistaken, SI is an index register that gets added to >DS? How do I work it all out? > >With thanks to anybody who spends their precious time on this, You need to use the go32 transfer buffer in low memory. Try this: #include #include /* get lfn */ static char * get_lfn( char *long_name, const char *short_name, int long_len) { __dpmi_regs r; dosmemput( short_name, strlen(short_name)+1, __tb); r.x.ax = 0x7160; /* Truename */ r.x.cx = 2; /* Get long name */ r.x.ds = r.x.es = __tb / 16; r.x.si = r.x.di = __tb & 15; __dpmi_int(0x21, &r); if (r.x.flags & 1 || r.x.ax == 0x7100) /* Shouldn't happen: LFN *is* supported and file *does* exist. */ return NULL; dosmemget(__tb, long_len, long_name); return long_name; } and wrap the call with a test, just to be safe: #include #include ... if (!_use_lfn( short_name ) || !get_lfn( long_name, short_name, long_len)) strcpy( long_name, short_name); -- Thanks. Take care, Brian Inglis Calgary, Alberta, Canada Brian DOT Inglis AT CSi DOT com (Brian[dot]Inglis{at}SystematicSW[dot]ab[dot]ca) fake address use address above to reply