xref: /csrg-svn/contrib/vmsprep/vmsprep.c (revision 31972)
1 
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <strings.h>
5 
6 main(argc,argv)
7 	int argc;
8 	char *argv[];
9 
10 {
11 
12 char cmd[1000];
13 char *release;
14 FILE *dirs;
15 FILE *files;
16 FILE *mover;
17 FILE *popen();
18 FILE *script;
19 char dirname[1000];
20 char filename[1000];
21 char fixedname[1000];
22 char fixedpath[1000];
23 char tapename[10];
24 char *scriptname = "UNPACK.COM";
25 char *altscript = "/tmp/UNPACK.COMXXXXXX";
26 char *startname = "AAAAAAAAA";
27 int i;
28 int j;
29 char *k;
30 int pathlen;
31 int dot;
32 int pipeout=0;
33 
34 	if(argc < 2) usage();
35 	if(*argv[1] == '-') {
36 		mover = stdout;
37 		pipeout=1;
38 	} else {
39 		mover = fopen("vmsprep.namelist","w");
40 	}
41 	strcpy(tapename,startname);
42 	if(pipeout) {
43 		mktemp(altscript);
44 		script = fopen(altscript,"w");
45 	} else {
46 		script = fopen(scriptname,"w");
47 	}
48 	for(j=1;j<argc;j++) {
49 		if(j==1 && *argv[j]=='-') continue;
50 		release = argv[j];
51 		strcpy(dirname,release);
52 		for(k=index(dirname,'/');k;k=index(k+1,'/')) {
53 			*k='\0';
54 			fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
55 			strcpy(dirname,release);
56 		}
57 		sprintf(cmd,
58 			"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type d -print\n", release);
59 		dirs = popen(cmd,"r");
60 		while(!feof(dirs)) {
61 			*dirname = NULL;
62 			fscanf(dirs," %s ",dirname);
63 			if(*dirname == NULL) continue;
64 			for(i=0;i<strlen(dirname);i++) {
65 				if(dirname[i]=='/') {
66 					dirname[i]='.';
67 				} else if (dirname[i]=='.') {
68 					dirname[i]='Z';
69 					fprintf(stderr,"vmsprep: warning - dot in filename illegal-");
70 					fprintf(stderr,"dot replaced by 'Z' %s\n",filename);
71 				} else if (!(isalpha(dirname[i]) || isdigit(dirname[i]))) {
72 					fprintf(stderr," error:  bad character in directory name %s\n",
73 							dirname);
74 				} else if(islower(dirname[i])) {
75 					dirname[i]=toupper(dirname[i]);
76 				}
77 			}
78 			fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
79 		}
80 		pclose(dirs);
81 
82 		sprintf(cmd,
83 			"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type f -print\n", release);
84 		files = popen(cmd,"r");
85 		while(!feof(files)) {
86 			fscanf(files," %s ",filename);
87 			if(*filename == NULL) continue;
88 			k = rindex(filename,'/') ;
89 			if(k != 0) {
90 				pathlen = k - filename;
91 			} else {
92 				pathlen=0;
93 				k = filename - 1;
94 			}
95 			strncpy(fixedpath,filename,pathlen);
96 			fixedpath[pathlen]='\0';
97 			strcpy(fixedname,k+1);
98 			for(i=0;i<pathlen;i++) {
99 				if(fixedpath[i]=='/') {
100 					fixedpath[i]='.';
101 				} else if (fixedpath[i]=='.') {
102 					fixedpath[i]='Z';
103 				} else if (!(isalpha(fixedpath[i]) || isdigit(fixedpath[i]))) {
104 					fprintf(stderr," error:  bad character in file name %s\n",
105 							filename);
106 				} else if(islower(fixedpath[i])) {
107 					fixedpath[i]=toupper(fixedpath[i]);
108 				}
109 			}
110 			for(i=0;i<strlen(fixedname);i++) {
111 				if(fixedname[i]=='/') {
112 					fixedname[i]='.';
113 				} else if (fixedname[i]=='.') {
114 					dot++;
115 					if(dot != 1) fixedname[i]='Z';
116 				} else if (!(isalpha(fixedname[i]) || isdigit(fixedname[i]))) {
117 					fprintf(stderr," error:  bad character in file name %s\n",
118 							filename);
119 					fixedname[i]='Z';
120 				} else if(islower(fixedname[i])) {
121 					fixedname[i]=toupper(fixedname[i]);
122 				}
123 			}
124 			if(dot >1 )
125 				fprintf(stderr,"error:  too many dots in filename %s \n",
126 					fixedname);
127 			sprintf(cmd,"%s %s.MOV\n", filename,tapename);
128 			fprintf(mover,"%s",cmd);
129 			if(*fixedpath != NULL) {
130 				fprintf(script,"$ RENAME %s.MOV [.%s]%s%s\n",tapename,fixedpath,
131 						fixedname,dot==0?".":"");
132 			} else {
133 				fprintf(script,"$ RENAME %s.MOV []%s%s\n",tapename,fixedname,
134 						dot==0?".":"");
135 			}
136 			dot=0;
137 			bumpname(tapename);
138 		}
139 	pclose(files);
140 	}
141 	fclose(script);
142 	if(pipeout) fprintf(mover,"%s ",altscript);
143 	fprintf(mover,"%s\n",scriptname);
144 	fclose(mover);
145 }
146 
147 bumpname(name)
148 	char name[10];
149 
150 {
151 int i;
152 	for(i=8;i>=0;i--) {
153 		name[i]++;
154 		if(name[i] > 'Z') {
155 			name[i] = 'A';
156 		} else {
157 			return;
158 		}
159 	}
160 }
161 usage() {
162 	fprintf(stderr,"vmsprep:  usage:  vmsprep dirname [dirname...] \n");
163 	exit();
164 }
165