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