/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */ #include #include #include #include #include #include #include static int msdos_toupper_fname(int c) { return (c >= 'a' && c <= 'z') ? toupper (c) : c; } char * _lfn_gen_short_fname(const char *long_fname, char *short_fname) { __dpmi_regs r = {0}; unsigned long tbuf = __tb; r.x.flags = 1; /* Always set CF before calling a 0x71NN function. */ r.x.ax = 0x7100; if (_USE_LFN) { dosmemput (long_fname, strlen (long_fname) + 1, tbuf); r.x.ax = 0x71a8; r.x.ds = tbuf >> 4; r.x.si = 0; r.x.es = r.x.ds; r.x.di = 260; r.x.dx = 0x0011; /* DH=01 would be better, but it's buggy */ __dpmi_int (0x21, &r); } if (!(r.x.flags & 1) && (r.x.ax != 0x7100)) { char buf[13], *s = buf, *d = short_fname; dosmemget (tbuf + 260, sizeof buf, buf); /* The short name in BUF is ASCIZ in the FCB format. Convert to 8.3 filename. */ while (s - buf < 8 && *s && *s != ' ') *d++ = *s++; #if 0 while (*s && *s == ' ') #else while (s - buf < 8 && *s && *s == ' ') #endif s++; #if 0 if (*s) #else if (*s != ' ') #endif { *d++ = '.'; #if 0 while (*s && *s != ' ') #else while (s - buf < 11 && *s && *s != ' ') #endif *d++ = *s++; } *d = '\0'; } else { const char *s = long_fname; char *d = short_fname; while ((*d++ = msdos_toupper_fname ((unsigned char)*s++))) if (d - short_fname >= 12) { *d = '\0'; break; } } return short_fname; } #ifdef TEST #include int main (int argc, char *argv[]) { char sh[13]; if (argc > 1) printf ("Orig: %s\nShort: %s\n", argv[1], _lfn_gen_short_fname(argv[1], sh)); return 0; } #endif