xref: /csrg-svn/contrib/vmsprep/vmsprep.c (revision 32594)
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 			for(i=0;i<strlen(fixedname);i++) {
112 				if(fixedname[i]=='/') {
113 					fixedname[i]='.';
114 				} else if (fixedname[i]=='.') {
115 					dot++;
116 					if(dot != 1) fixedname[i]='Z';
117 				} else if (!(isalpha(fixedname[i]) || isdigit(fixedname[i]))) {
118 					fprintf(stderr," error:  bad character in file name %s\n",
119 							filename);
120 					fixedname[i]='Z';
121 				} else if(islower(fixedname[i])) {
122 					fixedname[i]=toupper(fixedname[i]);
123 				}
124 			}
125 			if(dot >1 )
126 				fprintf(stderr,"error:  too many dots in filename %s \n",
127 					fixedname);
128 			sprintf(cmd,"%s %s.MOV\n", filename,tapename);
129 			fprintf(mover,"%s",cmd);
130 			if(*fixedpath != NULL) {
131 				fprintf(script,"$ RENAME %s.MOV [.%s]%s%s\n",tapename,fixedpath,
132 						fixedname,dot==0?".":"");
133 			} else {
134 				fprintf(script,"$ RENAME %s.MOV []%s%s\n",tapename,fixedname,
135 						dot==0?".":"");
136 			}
137 			dot=0;
138 			bumpname(tapename);
139 		}
140 	pclose(files);
141 	}
142 	fclose(script);
143 	if(pipeout) fprintf(mover,"%s ",altscript);
144 	fprintf(mover,"%s\n",scriptname);
145 	fclose(mover);
146 	return(0);
147 }
148 
149 bumpname(name)
150 	char name[10];
151 
152 {
153 int i;
154 	for(i=8;i>=0;i--) {
155 		name[i]++;
156 		if(name[i] > 'Z') {
157 			name[i] = 'A';
158 		} else {
159 			return;
160 		}
161 	}
162 }
163 usage() {
164 	fprintf(stderr,"vmsprep:  usage:  vmsprep dirname [dirname...] \n");
165 	exit(1);
166 }
167