xref: /original-bsd/contrib/vmsprep/vmsprep.c (revision e1db577d)
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 	fprintf(script,"$ SET NOON\n");
49 	for(j=1;j<argc;j++) {
50 		if(j==1 && *argv[j]=='-') continue;
51 		release = argv[j];
52 		strcpy(dirname,release);
53 		for(k=index(dirname,'/');k;k=index(k+1,'/')) {
54 			*k='\0';
55 			fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
56 			*k='.';
57 		}
58 		sprintf(cmd,
59 			"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type d -print\n", release);
60 		dirs = popen(cmd,"r");
61 		while(!feof(dirs)) {
62 			*dirname = NULL;
63 			fscanf(dirs," %s ",dirname);
64 			if(*dirname == NULL) continue;
65 			for(i=0;i<strlen(dirname);i++) {
66 				if(dirname[i]=='/') {
67 					dirname[i]='.';
68 				} else if (dirname[i]=='.') {
69 					dirname[i]='Z';
70 					fprintf(stderr,"vmsprep: warning - dot in filename illegal-");
71 					fprintf(stderr,"dot replaced by 'Z' %s\n",filename);
72 				} else if (!(isalpha(dirname[i]) || isdigit(dirname[i]))) {
73 					fprintf(stderr," error:  bad character in directory name %s\n",
74 							dirname);
75 				} else if(islower(dirname[i])) {
76 					dirname[i]=toupper(dirname[i]);
77 				}
78 			}
79 			fprintf(script,"$ CREATE/DIR [.%s] \n",dirname);
80 		}
81 		pclose(dirs);
82 
83 		sprintf(cmd,
84 			"find %s \\! \\( -name RCS -o -name \\*,v -o -name SCCS -o -name s.\\* \\) -type f -print\n", release);
85 		files = popen(cmd,"r");
86 		while(!feof(files)) {
87 			fscanf(files," %s ",filename);
88 			if(*filename == NULL) continue;
89 			k = rindex(filename,'/') ;
90 			if(k != 0) {
91 				pathlen = k - filename;
92 			} else {
93 				pathlen=0;
94 				k = filename - 1;
95 			}
96 			strncpy(fixedpath,filename,pathlen);
97 			fixedpath[pathlen]='\0';
98 			strcpy(fixedname,k+1);
99 			for(i=0;i<pathlen;i++) {
100 				if(fixedpath[i]=='/') {
101 					fixedpath[i]='.';
102 				} else if (fixedpath[i]=='.') {
103 					fixedpath[i]='Z';
104 				} else if (!(isalpha(fixedpath[i]) || isdigit(fixedpath[i]))) {
105 					fprintf(stderr," error:  bad character in file name %s\n",
106 							filename);
107 				} else if(islower(fixedpath[i])) {
108 					fixedpath[i]=toupper(fixedpath[i]);
109 				}
110 			}
111 			dot=0;
112 			for(i=0;i<strlen(fixedname);i++) {
113 				if(fixedname[i]=='/') {
114 					fixedname[i]='.';
115 				} else if (fixedname[i]=='.') {
116 					dot++;
117 					if(dot != 1) fixedname[i]='Z';
118 				} else if (!(isalpha(fixedname[i]) || isdigit(fixedname[i]))) {
119 					fprintf(stderr," error:  bad character in file name %s\n",
120 							filename);
121 					fixedname[i]='Z';
122 				} else if(islower(fixedname[i])) {
123 					fixedname[i]=toupper(fixedname[i]);
124 				}
125 			}
126 			if(dot >1 )
127 				fprintf(stderr,"error:  too many dots in filename %s \n",
128 					fixedname);
129 			sprintf(cmd,"%s %s.MOV\n", filename,tapename);
130 			fprintf(mover,"%s",cmd);
131 			if(*fixedpath != NULL) {
132 				fprintf(script,"$ RENAME %s.MOV [.%s]%s%s\n",tapename,fixedpath,
133 						fixedname,dot==0?".":"");
134 			} else {
135 				fprintf(script,"$ RENAME %s.MOV []%s%s\n",tapename,fixedname,
136 						dot==0?".":"");
137 			}
138 			dot=0;
139 			bumpname(tapename);
140 		}
141 	pclose(files);
142 	}
143 	fclose(script);
144 	if(pipeout) fprintf(mover,"%s ",altscript);
145 	fprintf(mover,"%s\n",scriptname);
146 	fclose(mover);
147 	return(0);
148 }
149 
150 bumpname(name)
151 	char name[10];
152 
153 {
154 int i;
155 	for(i=8;i>=0;i--) {
156 		name[i]++;
157 		if(name[i] > 'Z') {
158 			name[i] = 'A';
159 		} else {
160 			return;
161 		}
162 	}
163 }
164 usage() {
165 	fprintf(stderr,"vmsprep:  usage:  vmsprep dirname [dirname...] \n");
166 	exit(1);
167 }
168