1
2 #include <stdio.h>
3 #include <ctype.h>
4 #include <strings.h>
5
main(argc,argv)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
bumpname(name)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 }
usage()164 usage() {
165 fprintf(stderr,"vmsprep: usage: vmsprep dirname [dirname...] \n");
166 exit(1);
167 }
168