1 /* crlf.c : Defines the entry point for the console application.*/
3 /* Copyright 2000, International Business Machines Corporation and others.
6 This software has been released under the terms of the IBM Public
7 License. For details, see the LICENSE file in the top-level source
8 directory or online at http://www.openafs.org/dl/license10.html
12 #undef _CRTDBG_MAP_ALLOC
30 printf("util_cr file ;remove cr (from crlf)\n\
31 OR util_cr } ProductVersion in_filename out_filename ; substitute for %1-%5 in file\n\
32 %1=Major version, %2=Minor version, %3=Patch(first digit) %4=(last two digits) %5=Version display string \n\
33 ProductVersion=maj.min.pat.pat2 ;maj=numeric, min=numeric pat,pat2 are not more than 3 digits or 1-2 digits and one alpha \n\
34 e.g 1.0.4.1, 1.0.4 a 1.0.401, 1.0.4a all represent the same version\n\
35 OR util_cr + file ;add cr\n \
36 OR util_cr * \"+[register key value] x=y\" ; add register key value\n\
37 OR util_cr * \"-[register key value]\" ; aremove register key value\n\
38 OR util_cr @ file.ini \"[SectionKey]variable=value\" ; update ini-ipr-pwf file\n\
39 OR util_cr @ file.ini \"[SectionKey]variable=value*DatE*\" ; update ini-ipr-pwf file, insert date\n\
40 OR util_cr ~ ;force error\n\
41 OR util_cr _del [/q=quiet /s=recurese] [*. *. *.] ;delete \n\
42 OR util_cr _cpy [/q=quiet ] [*. *. *.] destinationFolder;\n\
43 OR util_cr _isOS [nt xp 98 9x w2] ;test for OS, return 1 if match else 0\n\
44 OR util_cr _dir !build type!source!object! set current directory in file->home base is used for offset\n\
45 OR unil_cr _ver return compiler version\n" );
50 WORD langID; // language ID
51 WORD charset; // character set (code page)
54 int CheckVersion(int argc,char *argv[])
56 OSVERSIONINFO VersionInfo;
58 memset(&VersionInfo,0,sizeof(VersionInfo));
59 VersionInfo.dwOSVersionInfoSize =sizeof(OSVERSIONINFO);
60 if (!GetVersionEx(&VersionInfo))
66 if (stricmp(argv[i],"nt")==0)
68 if ((VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
69 && (VersionInfo.dwMajorVersion==4)
70 && (VersionInfo.dwMinorVersion==0))
73 if (stricmp(argv[i],"xp")==0)
75 if ((VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
76 && (VersionInfo.dwMajorVersion==5)
77 && (VersionInfo.dwMinorVersion==1))
80 if (stricmp(argv[i],"w2")==0)
82 if ((VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
83 && (VersionInfo.dwMajorVersion==5)
84 && (VersionInfo.dwMinorVersion==0))
87 if (stricmp(argv[i],"98")==0)
89 if ((VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) && (VersionInfo.dwMinorVersion==10))
92 if (stricmp(argv[i],"95")==0)
94 if ((VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) && (VersionInfo.dwMinorVersion==0))
98 if (stricmp(argv[i],"9x")==0)
100 if (VersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
103 if (stricmp(argv[i],"_")==0)
109 void Addkey (const char *hkey,const char *subkey,const char *stag,const char *sval)
111 DWORD disposition,result;
113 if (strcmp(hkey,"HKEY_CLASSES_ROOT")==0) kHkey=HKEY_CLASSES_ROOT;
114 if (strcmp(hkey,"HKEY_CURRENT_USER")==0) kHkey=HKEY_CURRENT_USER;
115 if (strcmp(hkey,"HKEY_LOCAL_MACHINE")==0) kHkey=HKEY_LOCAL_MACHINE;
118 result=(RegCreateKeyEx(kHkey /*HKEY_LOCAL_MACHINE*/
121 ,REG_OPTION_NON_VOLATILE
124 ,&disposition)==ERROR_SUCCESS);
127 printf("AFS Error - Could Not create a registration key\n");
130 if (stag==NULL) return;
131 if ((sval)&&(strlen(sval)))
134 result=RegSetValueEx(kPkey,"",0,REG_SZ,(CONST BYTE *)sval,strlen(sval));
136 result=RegSetValueEx(kPkey,stag,0,REG_SZ,(CONST BYTE *)sval,strlen(sval));
140 result=(RegSetValueEx(kPkey,"",0,REG_SZ,(CONST BYTE *)"",0));
142 result=(RegSetValueEx(kPkey,stag,0,REG_SZ,(CONST BYTE *)"",0));
144 if(result!=ERROR_SUCCESS)
146 printf("AFS Error - Could Not create a registration key\n");
151 void Subkey(const char *hkey,const char *subkey)
155 if (strcmp(hkey,"HKEY_CLASSES_ROOT")==0) kHkey=HKEY_CLASSES_ROOT;
156 if (strcmp(hkey,"HKEY_CURRENT_USER")==0) kHkey=HKEY_CURRENT_USER;
157 if (strcmp(hkey,"HKEY_LOCAL_MACHINE")==0) kHkey=HKEY_LOCAL_MACHINE;
164 if(result!=ERROR_SUCCESS)
166 printf("AFS Error - Could Not create a registration key\n");
171 void doremove(BOOL bRecurse,BOOL bQuiet,char* argv)
174 char parm[MAX_PATH+1];
175 char basdir[MAX_PATH+1];
178 GetCurrentDirectory(sizeof(basdir),basdir);
179 if (strrchr(parm,'\\')!=NULL)
180 {/*jump to base directory*/
181 pParm=strrchr(parm,'\\');
183 if (!SetCurrentDirectory(parm))
189 struct _finddata_t fileinfo;
192 char basdir[MAX_PATH+1];
193 GetCurrentDirectory(sizeof(basdir),basdir);
194 hfile=_findfirst(pParm,&fileinfo);
198 if ((DeleteFile(fileinfo.name)==1) && (!bQuiet))
199 printf("Remove %s\\%s\n",basdir,fileinfo.name);
200 bmore=(_findnext(hfile,&fileinfo)==0);
204 /*RECURSIVE LOOP - SCAN directories*/
205 struct _finddata_t fileinfo;
208 doremove(FALSE,bQuiet,pParm);
209 hfile=_findfirst("*.*",&fileinfo);
213 if (fileinfo.attrib & _A_SUBDIR)
215 if ((strcmp(fileinfo.name,".")!=0) && (strcmp(fileinfo.name,"..")!=0))
217 if (SetCurrentDirectory(fileinfo.name))
218 doremove(TRUE,bQuiet,pParm);
219 SetCurrentDirectory(basdir);
222 bmore=(_findnext(hfile,&fileinfo)==0);
226 SetCurrentDirectory(basdir);
229 void gencurdir(char *val)
231 char bld[MAX_PATH+1],parm[MAX_PATH+1],src[MAX_PATH+1],obj[MAX_PATH+1],dir[MAX_PATH+1],curdir[MAX_PATH+1];
234 BOOL isObjAbs,isSrcAbs; /* two flags to determine if either string is not relative*/
235 strcpy(bld,val+1); /*it better be checked or free*/
236 strcpy(src,strchr(bld,'!')+1);
237 strcpy(obj,strchr(src,'!')+1);
241 isObjAbs=((*obj=='\\')||(strstr(obj,":")));
242 isSrcAbs=((*src=='\\')||(strstr(src,":")));
243 GetCurrentDirectory(MAX_PATH,dir);
249 strcat(curdir,"\\ \n");
250 if (GetTempPath(MAX_PATH,parm)==0)
253 if ((f=fopen(parm,"w"))==NULL)
257 if (obj[strlen(obj)-1]!='\\')
259 if (src[strlen(src)-1]!='\\')
261 do {/* try to match src or obj*/
262 if ((p=strstr(dir,src)) && isSrcAbs)
266 } else if ((p=strstr(dir,src)) && !isSrcAbs && *(p-1)=='\\')
270 } else if ( (p=strstr(dir,obj)) && isObjAbs)
274 } else if ((p=strstr(dir,obj)) && !isObjAbs && *(p-1)=='\\')
279 } while (strstr(p,src)||strstr(p,obj));
281 sprintf(parm,"OJT=%s%s\\%s \n",obj,bld,p);
284 sprintf(parm,"OJT=%s%s%s\\%s \n",dir,obj,bld,p);
286 if (strcmp(curdir,parm+4)==0) /* current directory is object*/
287 strcpy(parm,"OJT= \n");
288 fwrite(parm,strlen(parm),1,f);
290 sprintf(parm,"SRT=%s%s\\ \n",src,p);
293 sprintf(parm,"SRT=%s%s%s\\ \n",dir,src,p);
295 if (strcmp(curdir,parm+4)==0) /* current directory is object*/
296 strcpy(parm,"SRT= \n");
297 fwrite(parm,strlen(parm),1,f);
298 /* now lets set the AFS_LASTCMP environment variable */
299 sprintf(parm,"AFS_LASTCMP=%s\\%s",src,p);
301 __except(EXCEPTION_EXECUTE_HANDLER ){
310 int isequal(char *msg1,char *msg2,char *disp)
315 if (strcmp(msg1,msg2)!=0)
317 printf("ERROR -- %s \n",disp);
321 int SetSysEnv(int argc,char * argv[])
325 printf("assignment %s %s\n",argv[2],argv[3]);
326 Addkey("HKEY_LOCAL_MACHINE","System\\CurrentControlSet\\Control\\Session Manager\\Environment"
330 SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,(DWORD)"Environment",SMTO_NORMAL,1,&dwResult);
334 int main(int argc, char* argv[])
336 /* typedef char * CHARP;*/
346 if (strcmp(argv[1],"_sysvar")==0)
350 return (SetSysEnv(argc,argv));
353 if (strnicmp(argv[1],"_dir",4)==0){ /*get current directory routine*/
357 if (strnicmp(argv[1],"_isequal",4)==0){ /*get current directory routine*/
358 return isequal(argv[2],argv[3],argv[4]);
360 if (stricmp(argv[1],"_del")==0) /*DELETE routine*/
363 if ((argc>iargc) && (stricmp(argv[iargc],"/s")==0))
368 if ((argc>iargc) && (stricmp(argv[iargc],"/q")==0))
373 if ((argc>iargc) && (stricmp(argv[iargc],"/s")==0))
380 doremove(bRecurse,bQuiet,argv[iargc]);
385 if (strcmp(argv[1],"_ver")==0)
391 if (strcmp(argv[1],"_isOS")==0)
392 return CheckVersion(argc,argv);
393 if (strcmp(argv[1],"}")==0)
395 char v1[4],v2[4],v3[4],v4[4];
405 if ((ptr=strtok(argv[2],". \n"))==NULL)
408 if ((ptr=strtok(NULL,". \n"))==NULL)
411 if ((ptr=strtok(NULL,". \n"))==NULL)
420 if (isdigit(*ptr)!=0)
423 case 2: //ONLY 1.0.44 is interpreted as 1.0.4.4 or 1.0.4a as 1.0.4.a
424 if (isdigit(*ptr)==0)
428 if (isalpha(*ptr)==0)
431 } else if (isalpha(*ptr)!=0)
433 pat2=tolower(*ptr)-'a'+1;
437 case 3://1.0.401 or 1.0.40a are the same;
438 if ((isdigit(*ptr)==0) // first 2 must be digit
439 || (isdigit(*(ptr+1)==0))
440 || (*(ptr+1)!='0' && isdigit(*(ptr+2))==0) // disallow 1.0.4b0 or 1.0.41a
448 pat2=tolower(*ptr)-'a'+1;
453 // last can be 1-2 digits or one alpha (if pat2 hasn't been set)
454 if ((ptr=strtok(NULL,". \n"))!=NULL)
461 pat2=(isdigit(*ptr))?atoi(ptr):tolower(*ptr)-'a'+1;
466 || isdigit(*(ptr+1))==0
474 file=fopen(argv[3],"r");
477 len=filelength(_fileno(file));
478 buf=(char *)malloc(len+1);
479 len=fread(buf,sizeof(char),len,file);
480 buf[len]=0; //set eof
482 file=fopen(argv[4],"w");
485 sprintf(v1,"%i",maj);
486 sprintf(v2,"%i",min);
487 sprintf(v3,"%i",pat);
488 sprintf(v4,"%02i",pat2);
492 fwrite(buf,1,(ptr)?ptr-buf:strlen(buf),file); //write file if no % found or up to %
495 switch (*(ptr+1)) //skip first scan if buf="1...."
498 fwrite(v1,1,strlen(v1),file);
502 fwrite(v2,1,strlen(v2),file);
506 fwrite(v3,1,strlen(v3),file);
510 fwrite(v4,1,strlen(v4),file);
514 fwrite(v5,1,strlen(v5),file);
518 fwrite("%",1,1,file); //either % at end of file or no %1...
526 if (strcmp(argv[1],"~")==0)
527 { //check for file presence
528 if (fopen(argv[2],"r"))
531 printf("ERROR --- File not present %s\n",argv[2]);
533 printf("Error---%s\n",argv[3]);
536 if (strcmp(argv[1],"*")==0)
537 { /* "[HKEY_CLASSES_ROOT\CLSID\{DC515C27-6CAC-11D1-BAE7-00C04FD140D2}] @=AFS Client Shell Extension" */
540 for (i=2;argc>=3;i++)
542 char *ssub=strtok(argv[i],"[");
544 char *skey=strtok(NULL,"]");
546 if ((ssub==NULL) || (skey==NULL))
548 printf("format error parameter %s\n",argv[i]);
552 stag=strtok(NULL,"\0");
556 ssub=strtok(skey,"\\");
557 ssub=strtok(NULL,"\0");
558 sval=strtok(stag,"=");
559 sval=strtok(NULL,"\0");
563 Addkey (skey,ssub,stag,sval);
567 Addkey (skey,ssub,stag,"");
577 if (strcmp(argv[1],"@")==0)
579 char msg[256],msgt[256];
583 for (i=3;argc>=4;i++)
586 char *ssect=strstr(argv[i],"[");
587 char *skey=strstr(ssect,"]");
589 if ((ssect==NULL) || (skey==NULL))
591 printf("format error parameter %s\n",argv[i]);
596 if ((strlen(skey+1)==0)||(strlen(ssect)==0))
598 printf("format error parameter %s\n",argv[i]);
602 sval=strstr(skey,"=");
605 printf("format error parameter %s\n",argv[i]);
611 while(*++sval==' ') ;
612 if (ptr=strstr(sval,"*DatE*"))
613 {// ok so lets substitute date in this string;
623 if (ptr=strstr(sval,"*TimE*"))
629 strncat(msgt,tmpbuf,5);
633 if (WritePrivateProfileString(ssect,skey,sval,argv[2])==0)
637 FORMAT_MESSAGE_ALLOCATE_BUFFER |
638 FORMAT_MESSAGE_FROM_SYSTEM |
639 FORMAT_MESSAGE_IGNORE_INSERTS,
642 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
647 printf("Error writing profile string - %s",lpMsgBuf);
648 LocalFree( lpMsgBuf );
655 strcpy(fname,argv[2]);
656 if (strcmp(argv[1],"+")==0)
658 file=fopen(fname,"rb");
661 len=filelength(_fileno(file));
662 ch=(char *)malloc(len+2);
663 *ch++=0; /* a small hack to allow matching /r/n if /n is first character*/
664 len=fread(ch,sizeof(char),len,file);
665 file=freopen(fname,"wb",file);
668 if ((*ch=='\n') && (*(ch-1)!='\r')) /*line feed alone*/
678 if (strcmp(argv[1],"-")==0)
680 strcpy(fname,argv[2]);
681 file=fopen(fname,"rb");
684 len=filelength(_fileno(file));
685 ch=(char *)malloc(len+1);
686 len=fread(ch,sizeof(char),len,file);
687 file=freopen(fname,"wb",file);
697 if (strstr(fname,".et")==NULL)
699 file=fopen(fname,"rb");
702 len=filelength(_fileno(file));
703 ch=(char *)malloc(len+1);
704 len=fread(ch,sizeof(char),len,file);
705 file=freopen(fname,"wb",file);
713 pvar=(char **)malloc(argc*sizeof(char *));
714 for (i=1;i<argc-1;i++)
718 l=_spawnvp(_P_WAIT,argv[1],pvar);