本来嫌 gcc 自作主张把参数中的 *.txt 扩展成文件名导致由 --help.txt 引起的错误解析,所以去修改了一下 sed.c 。
不过改完后突然想到其实只要使用的时候都加上路径 .\*.txt 就可以避免,所以还是不把编译好的文件放上来了。
--------------------------------------------------------------------------------
记录一下修改步骤:
1、
在 main 之前加上: | #include <windows.h> | | #include <dir.h> | | | | char * CommandLineToArgvA(char * Commandline,int * argc){ | | char *p,*q,*_Commandline[2048],**_argv; | | int len,inQuo; | | | | strcpy(_Commandline,Commandline); | | | | _argv = (char*)malloc(1024*sizeof(char)); | | *argc=inQuo=0,q=p=_Commandline; | | while(1){ | | if(!*p||(!inQuo&&(*p==' '||*p=='\t'))){ | | len=p-q; | | _argv[*argc]=(char*)malloc((len+1)*sizeof(char)); | | if(*q=='"' && *(p-1)=='"'){ | | q++, len-=2; | | } | | memcpy(_argv[*argc],q,len); | | _argv[(*argc)++][len]='\0'; | | | | for(++p;*p&&(*p==' '||*p=='\t');++p){} | | q=p; | | } | | if(*p=='"')inQuo=!inQuo; | | if(!*p++)break; | | } | | | | return _argv; | | } | | | | char * get_file_list(int * argv, int argc){ | | WIN32_FIND_DATA FileInfo; | | int F_isDir; | | long Handle; | | int i=0, len=0; | | char lpPath[2048]=""; | | char *p; | | | | char **_argv =(char*)malloc(8*1024*1024); | | while(argc--){ | | strcpy(lpPath, *argv); | | p = strrchr(lpPath,'\\')>strrchr(lpPath,'/') ? strrchr(lpPath,'\\') : strrchr(lpPath,'/') ; | | if(p){ | | *(p+1) = '\0'; | | } else { | | lpPath[0] = '\0'; | | } | | | | if((Handle=FindFirstFile(*argv,&FileInfo))!=-1L){ | | while(1){ | | if(!strcmp(FileInfo.cFileName,".")||!strcmp(FileInfo.cFileName,".."))goto NextFile; | | if(FileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)goto NextFile; | | len = strlen(FileInfo.cFileName); | | _argv[i]=(char*)malloc((len+1)*sizeof(char)); | | | | strcpy(_argv[i],lpPath); | | strcat(_argv[i],FileInfo.cFileName); | | i++; | | | | NextFile: | | if(!FindNextFile(Handle,&FileInfo))break; | | } | | } | | argv++; | | } | | return _argv; | | }COPY |
--------------------------------------------------------------------------------
2、
在 main 的头部加上 | int _argc_=0; | | char **_argv_; | | _argv_=CommandLineToArgvA(GetCommandLineA(),&_argc_); | | argc = _argc_; | | | | int nn =0; | | for(nn=0; nn<argc; nn++){ | | strcpy(argv[nn],_argv_[nn]); | | }COPY |
--------------------------------------------------------------------------------
3、
再把 return_code = process_files(the_program, argv+optind);COPY 改为: return_code = process_files(the_program, get_file_list(argv+optind, argc-optind));COPY
|