diff options
Diffstat (limited to 'os2/suffix.c')
-rw-r--r-- | os2/suffix.c | 147 |
1 files changed, 0 insertions, 147 deletions
diff --git a/os2/suffix.c b/os2/suffix.c deleted file mode 100644 index d766da37bc..0000000000 --- a/os2/suffix.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Suffix appending for in-place editing under MS-DOS and OS/2. - * - * Here are the rules: - * - * Style 0: Append the suffix exactly as standard perl would do it. - * If the filesystem groks it, use it. (HPFS will always - * grok it. FAT will rarely accept it.) - * - * Style 1: The suffix begins with a '.'. The extension is replaced. - * If the name matches the original name, use the fallback method. - * - * Style 2: The suffix is a single character, not a '.'. Try to add the - * suffix to the following places, using the first one that works. - * [1] Append to extension. - * [2] Append to filename, - * [3] Replace end of extension, - * [4] Replace end of filename. - * If the name matches the original name, use the fallback method. - * - * Style 3: Any other case: Ignore the suffix completely and use the - * fallback method. - * - * Fallback method: Change the extension to ".$$$". If that matches the - * original name, then change the extension to ".~~~". - * - * If filename is more than 1000 characters long, we die a horrible - * death. Sorry. - * - * The filename restriction is a cheat so that we can use buf[] to store - * assorted temporary goo. - * - * Examples, assuming style 0 failed. - * - * suffix = ".bak" (style 1) - * foo.bar => foo.bak - * foo.bak => foo.$$$ (fallback) - * foo.$$$ => foo.~~~ (fallback) - * makefile => makefile.bak - * - * suffix = "~" (style 2) - * foo.c => foo.c~ - * foo.c~ => foo.c~~ - * foo.c~~ => foo~.c~~ - * foo~.c~~ => foo~~.c~~ - * foo~~~~~.c~~ => foo~~~~~.$$$ (fallback) - * - * foo.pas => foo~.pas - * makefile => makefile.~ - * longname.fil => longname.fi~ - * longname.fi~ => longnam~.fi~ - * longnam~.fi~ => longnam~.$$$ - * - */ - -#include "EXTERN.h" -#include "perl.h" -#ifdef OS2 -#define INCL_DOSFILEMGR -#define INCL_DOSERRORS -#include <os2.h> -#endif /* OS2 */ - -static char suffix1[] = ".$$$"; -static char suffix2[] = ".~~~"; - -#define ext (&buf[1000]) - -add_suffix(str,suffix) -register STR *str; -register char *suffix; -{ - int baselen; - int extlen; - char *s, *t, *p; - STRLEN slen; - - if (!(str->str_pok)) (void)str_2ptr(str); - if (str->str_cur > 1000) - fatal("Cannot do inplace edit on long filename (%d characters)", str->str_cur); - -#ifdef OS2 - /* Style 0 */ - slen = str->str_cur; - str_cat(str, suffix); - if (valid_filename(str->str_ptr)) return; - - /* Fooey, style 0 failed. Fix str before continuing. */ - str->str_ptr[str->str_cur = slen] = '\0'; -#endif /* OS2 */ - - slen = strlen(suffix); - t = buf; baselen = 0; s = str->str_ptr; - while ( (*t = *s) && *s != '.') { - baselen++; - if (*s == '\\' || *s == '/') baselen = 0; - s++; t++; - } - p = t; - - t = ext; extlen = 0; - while (*t++ = *s++) extlen++; - if (extlen == 0) { ext[0] = '.'; ext[1] = 0; extlen++; } - - if (*suffix == '.') { /* Style 1 */ - if (strEQ(ext, suffix)) goto fallback; - strcpy(p, suffix); - } else if (suffix[1] == '\0') { /* Style 2 */ - if (extlen < 4) { - ext[extlen] = *suffix; - ext[++extlen] = '\0'; - } else if (baselen < 8) { - *p++ = *suffix; - } else if (ext[3] != *suffix) { - ext[3] = *suffix; - } else if (buf[7] != *suffix) { - buf[7] = *suffix; - } else goto fallback; - strcpy(p, ext); - } else { /* Style 3: Panic */ -fallback: - (void)bcopy(strEQ(ext, suffix1) ? suffix2 : suffix1, p, 4+1); - } - str_set(str, buf); -} - -#ifdef OS2 -int -valid_filename(s) -char *s; -{ - HFILE hf; - USHORT usAction; - - switch(DosOpen(s, &hf, &usAction, 0L, 0, FILE_OPEN, - OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L)) { - case ERROR_INVALID_NAME: - case ERROR_FILENAME_EXCED_RANGE: - return 0; - case NO_ERROR: - DosClose(hf); - /*FALLTHROUGH*/ - default: - return 1; - } -} -#endif /* OS2 */ |