mkmanifest source
egray at fthood.UUCP
egray at fthood.UUCP
Fri Jun 17 01:05:00 AEST 1988
This is a simple little program that creates a shell script that is
designed to restore Unix file names after they have been bludgened to
fit the MSDOS file name restrictions. It comes in handy when using my
Mtools, Pcomm, or the Unix version of arc that was posted.
All the programs mentioned above take considerable amount of pride in
converting a perfectly good Unix file name to fix the MSDOS rules.
Typically this would include:
Not case sensitive
File name <= 8 characters
Extention <= 3 characters
No MSDOS device names
None of the following characters: ^+=/[]:',?*\<>|\.
For example, this is my mtools directory:
Conversion Unixpc.shar mrd.c
Makefile convdate.c mread.c
Mdel.1 fixname.c mren.c
Mdir.1 getfat.c msdos.h
Mmd.1 init.c mtype.c
Mrd.1 isdir.c mwrite.c
Mread.1 match.c putfat.c
Mren.1 mdel.c search.c
Mtype.1 mdir.c subdir.c
Mwrite.1 mkentry.c unixname.c
Readme mmd.c
To put these files on a MSDOS disk would mean all the uppercase file
names and the Unixpc.shar file (because the extention is 4 characters)
would be modified by Mtools. Using this example, you'd type:
mkmanifest *
to produce the following on the stdout:
mv conversion Conversion
mv makefile Makefile
mv mdel.1 Mdel.1
mv mdir.1 Mdir.1
mv mmd.1 Mmd.1
mv mrd. Mrd.1
mv mread.1 Mread.1
mv mren.1 Mren.1
mv mtype.1 Mtype.1
mv mwrite.1 Mwrite.1
mv readme Readme
mv unixpc.sha Unixpc.shar
The output of mkmanifest could be collected in a file and the file
could be put on the diskette to be used later to restore the names.
Typically I use:
mkmanifest * > manifest
and then include the file manifest with the files on the diskette.
Have fun...
Emmet P. Gray US Army, HQ III Corps & Fort Hood
...!uunet!uiucuxc!fthood!egray Attn: AFZF-DE-ENV
Directorate of Engineering & Housing
Environmental Management Office
Fort Hood, TX 76544-5057
-----------------------------------------------------------------------------
/*
* A program to create a manifest (shiping list) that is a shell script
* to return a Unix file name to it's original state after it has been
* clobbered by MSDOS's file name restrictions.
*/
#include <stdio.h>
#include <ctype.h>
main(argc, argv)
int argc;
char *argv[];
{
int i;
char *name, *new_name, *fixname(), *strrchr();
void exit();
if (argc == 1) {
fprintf(stderr, "Usage: mkmanifest <list-of-files>\n");
exit(1);
}
for (i=1; i<argc; i++) {
/* zap the leading path */
if (name = strrchr(argv[i], '/'))
name++;
else
name = argv[i];
/* create new name */
new_name = fixname(name);
if (strcmp(new_name, name))
printf("mv %s %s\n", new_name, name);
}
exit(0);
}
char *
fixname(name)
char *name;
{
static char *dev[8] = {"con", "aux", "com1", "lpt1", "prn", "lpt2",
"lpt3", "nul"};
char *s, *temp, *ext, *malloc(), *strcpy(), *strpbrk(), *strcat();
char temp_buf[15];
int i, dot;
static char ans[13];
strcpy(temp_buf, name);
temp = &temp_buf[0];
/* separate the name from extention */
ext = NULL;
dot = 0;
for (s = temp; *s; ++s) {
if (*s == '.' && !dot) {
dot = 1;
*s = NULL;
ext = s + 1;
}
if (isupper(*s))
*s = tolower(*s);
}
/* if no name */
if (*temp == NULL)
temp = "x";
/* if name is a device */
for (i=0; i<8; i++) {
if (!strcmp(temp, dev[i]))
*temp = 'x';
}
/* name too long? */
if (strlen(temp) > 8)
*(temp+8) = NULL;
/* extention too long? */
if (strlen(ext) > 3)
*(ext+3) = NULL;
/* illegal characters? */
while (s = strpbrk(temp, "^+=/[]:',?*\\<>|\". "))
*s = 'x';
while (s = strpbrk(ext, "^+=/[]:',?*\\<>|\". "))
*s = 'x';
strcpy(ans, temp);
if (*ext) {
strcat(ans, ".");
strcat(ans, ext);
}
return(ans);
}
More information about the Unix-pc.sources
mailing list