170 lines
3.9 KiB
C
170 lines
3.9 KiB
C
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
#define index strchr
|
|
#define rindex strrchr
|
|
|
|
main(argc,argv)
|
|
int argc;
|
|
char *argv[];
|
|
|
|
{
|
|
|
|
char cmd[1000];
|
|
char *release;
|
|
FILE *dirs;
|
|
FILE *files;
|
|
FILE *mover;
|
|
FILE *script;
|
|
char dirname[1000];
|
|
char filename[1000];
|
|
char fixedname[1000];
|
|
char fixedpath[1000];
|
|
char tapename[10];
|
|
char *scriptname = "UNPACK.COM";
|
|
char *altscript = "/tmp/UNPACK.COMXXXXXX";
|
|
char *startname = "AAAAAAAAA";
|
|
int i;
|
|
int j;
|
|
char *k;
|
|
int pathlen;
|
|
int dot;
|
|
int pipeout=0;
|
|
|
|
if(argc < 2) usage();
|
|
if(*argv[1] == '-') {
|
|
mover = stdout;
|
|
pipeout=1;
|
|
} else {
|
|
mover = fopen("vmsprep.namelist","w");
|
|
}
|
|
strcpy(tapename,startname);
|
|
if(pipeout) {
|
|
mktemp(altscript);
|
|
script = fopen(altscript,"w");
|
|
} else {
|
|
script = fopen(scriptname,"w");
|
|
}
|
|
fprintf(script,"$ SET NOON\n");
|
|
for(j=1;j<argc;j++) {
|
|
if(j==1 && *argv[j]=='-') continue;
|
|
release = argv[j];
|
|
strcpy(dirname,release);
|
|
for(k=index(dirname,'/');k;k=index(k+1,'/')) {
|
|
*k='\0';
|
|
fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
|
|
*k='.';
|
|
}
|
|
sprintf(cmd,
|
|
"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type d -print\n", release);
|
|
dirs = popen(cmd,"r");
|
|
while(!feof(dirs)) {
|
|
*dirname = NULL;
|
|
fscanf(dirs," %s ",dirname);
|
|
if(*dirname == NULL) continue;
|
|
for(i=0;i<strlen(dirname);i++) {
|
|
if(dirname[i]=='/') {
|
|
dirname[i]='.';
|
|
} else if (dirname[i]=='.') {
|
|
dirname[i]='Z';
|
|
fprintf(stderr,"vmsprep: warning - dot in filename illegal-");
|
|
fprintf(stderr,"dot replaced by 'Z' %s\n",filename);
|
|
} else if (!(isalpha(dirname[i]) || isdigit(dirname[i]))) {
|
|
fprintf(stderr," error: bad character in directory name %s\n",
|
|
dirname);
|
|
} else if(islower(dirname[i])) {
|
|
dirname[i]=toupper(dirname[i]);
|
|
}
|
|
}
|
|
fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
|
|
}
|
|
pclose(dirs);
|
|
|
|
sprintf(cmd,
|
|
"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type f -print\n", release);
|
|
files = popen(cmd,"r");
|
|
while(!feof(files)) {
|
|
fscanf(files," %s ",filename);
|
|
if(*filename == NULL) continue;
|
|
k = rindex(filename,'/') ;
|
|
if(k != 0) {
|
|
pathlen = k - filename;
|
|
} else {
|
|
pathlen=0;
|
|
k = filename - 1;
|
|
}
|
|
strncpy(fixedpath,filename,pathlen);
|
|
fixedpath[pathlen]='\0';
|
|
strcpy(fixedname,k+1);
|
|
for(i=0;i<pathlen;i++) {
|
|
if(fixedpath[i]=='/') {
|
|
fixedpath[i]='.';
|
|
} else if (fixedpath[i]=='.') {
|
|
fixedpath[i]='Z';
|
|
} else if (!(isalpha(fixedpath[i]) || isdigit(fixedpath[i]))) {
|
|
fprintf(stderr," error: bad character in file name %s\n",
|
|
filename);
|
|
} else if(islower(fixedpath[i])) {
|
|
fixedpath[i]=toupper(fixedpath[i]);
|
|
}
|
|
}
|
|
dot=0;
|
|
for(i=0;i<strlen(fixedname);i++) {
|
|
if(fixedname[i]=='/') {
|
|
fixedname[i]='.';
|
|
} else if (fixedname[i]=='.') {
|
|
dot++;
|
|
if(dot != 1) fixedname[i]='Z';
|
|
} else if (!(isalpha(fixedname[i]) || isdigit(fixedname[i]))) {
|
|
fprintf(stderr," error: bad character in file name %s\n",
|
|
filename);
|
|
fixedname[i]='Z';
|
|
} else if(islower(fixedname[i])) {
|
|
fixedname[i]=toupper(fixedname[i]);
|
|
}
|
|
}
|
|
if(dot >1 )
|
|
fprintf(stderr,"error: too many dots in filename %s \n",
|
|
fixedname);
|
|
sprintf(cmd,"%s %s.MOV\n", filename,tapename);
|
|
fprintf(mover,"%s",cmd);
|
|
if(*fixedpath != NULL) {
|
|
fprintf(script,"$ RENAME %s.MOV [.%s]%s%s\n",tapename,fixedpath,
|
|
fixedname,dot==0?".":"");
|
|
} else {
|
|
fprintf(script,"$ RENAME %s.MOV []%s%s\n",tapename,fixedname,
|
|
dot==0?".":"");
|
|
}
|
|
dot=0;
|
|
bumpname(tapename);
|
|
}
|
|
pclose(files);
|
|
}
|
|
fclose(script);
|
|
if(pipeout) fprintf(mover,"%s ",altscript);
|
|
fprintf(mover,"%s\n",scriptname);
|
|
fclose(mover);
|
|
return(0);
|
|
}
|
|
|
|
bumpname(name)
|
|
char name[10];
|
|
|
|
{
|
|
int i;
|
|
for(i=8;i>=0;i--) {
|
|
name[i]++;
|
|
if(name[i] > 'Z') {
|
|
name[i] = 'A';
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
usage() {
|
|
fprintf(stderr,"vmsprep: usage: vmsprep dirname [dirname...] \n");
|
|
exit(1);
|
|
}
|