第三次遍历源代码,整理typedef
思路、待完善...,
这个逻辑点比较复杂。
1 #include <io.h> 2 #include <time.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <fcntl.h> 7 #include <sys/stat.h> 8 #include <unistd.h> 9 #include <tchar.h> 10 #include <dirent.h> 11 #include <wchar.h> 12 #include <winsock2.h> 13 #include <Windows.h> 14 15 struct defType{ 16 struct defType *next; 17 char effect; /*常规、指针、数组、函数指针*/ 18 char otp[64]; /*旧类型名称*/ 19 char *nvar; /*新变量名称*/ 20 }; 21 22 struct sueChain{ 23 struct defSue *next; 24 char name[64]; 25 char mold; /*1:struct 2:union 3:enum*/ 26 char *sue; /*指向一个结构体字符串*/ 27 }; 28 29 struct sueChain *scP,sC; 30 struct defType *dtP,dT; 31 32 int lstat(const char *str, struct stat *sb) 33 { 34 int fd, rv; 35 36 if ((fd = open(str, 0)) < 0) 37 return (-1); 38 rv = fstat(fd, sb); 39 (void)close(fd); 40 return (rv); 41 } 42 43 //第三次遍历源代码,整理typedef 44 int typelist(char *file) 45 { 46 int fd; 47 char *pl; 48 struct stat fst; 49 unsigned long int i,j,k,n,p,s,ret,mark; 50 unsigned char temp[1024],buf[3200000]; 51 52 fd = open(file,O_RDONLY|O_BINARY,00700); 53 if(fd == -1)return printf("open file - %s error...\n",file); 54 fstat( fd, &fst ); 55 56 lseek( fd, 0, SEEK_SET );//再定位文件指针到文件头 57 58 if(fst.st_size == 0)return printf("file size is zeero...\n"); 59 else if(fst.st_size > 3200000)return printf("sory file size too large...\n"); 60 //直接读内存缓冲区 61 ret=read(fd,&buf,fst.st_size); 62 if(ret != fst.st_size)return printf("file read size is something the matter...\n"); 63 //开始循环提取一行数据 64 for(i=0;i<ret;i++) 65 { 66 pl=&buf[i]; 67 //pl 就是一行的数据 typedef 判断后面5个字母ypedef 68 for(;pl[i]!='t' && pl[i];i++); 69 if(pl[i]=='y' && pl[i+1]=='p' && pl[i+2]=='e' && pl[i+3]=='d' && 70 pl[i+4]=='e' && pl[i+5]=='f') 71 { 72 i+=6; 73 //直接跳过Space tab... 74 for(;pl[i]==0x20 || pl[i]==0x09 || pl[i]==0x0d || pl[i]==0x0a;i++); 75 while(dtP->next)dtP=dtP->next; 76 //常规、指针、数组、函数指针 77 for(n=0;pl[i]!=0x20 && pl[i]!=0x09 && pl[i] && pl[i]!=';';i++,n++) 78 dtP->otp[n] = pl[i]; 79 if(pl[i]==0x20 || pl[i]==0x09) 80 { 81 dtP->otp[n] = 0x20; 82 //struct union enum 83 //typedef struct abc newabc; 84 //typedef struct abc{...} newabc,*newp; 85 for(i++;pl[i]==0x20 || pl[i]==0x09;i++)mark = i;//跳过空格和tab 86 if(strncasecmp( dtP->otp[n], "struct",6) == 0 || 87 strncasecmp( dtP->otp[n], "union",5) == 0 || 88 strncasecmp( dtP->otp[n], "enum" ,4) == 0) 89 { 90 for(;pl[i]==0x20 || pl[i]==0x09;i++)mark = i;//mark点 ,跳过空格和tab 91 if(mark == (i-1)){n++;dtP->otp[n] = 0x20;} 92 for(n++;pl[i]!=0x20 && pl[i]!=0x09 && n<64 && pl[i]!='{' && pl[i]!=';' && pl[i];i++,n++) 93 dtP->otp[n] = pl[i]; 94 dtP->otp[n] = 0; 95 for(;pl[i]==0x20 || pl[i]==0x09;i++); 96 //如果中间有类型定义 struct abc{...} newabc,*newp; 97 if(pl[i]=='{') 98 { 99 for(i++;pl[i]!='}' && pl[i]!=';' && pl[i];i++); 100 //把这个结构定义加入到 链表中 101 ... 102 for(i++;pl[i]==0x20 || pl[i]==0x09;i++); 103 } 104 else 105 { 106 107 //for(i++;pl[i]==0x20 || pl[i]==0x09;i++); 108 } 109 else if(pl[i]==',')//[[typedef struct union BOOL,ZJ ;]] 110 { 111 ... 112 break; 113 } 114 } 115 //typedef long double REAL; 116 //typedef int BOOL ; 117 //typedef char * PCHAR; || typedef char* PCHAR; || typedef const char* PCHAR; 118 //typedef unsigned __int64 size_t; 119 //typedef int INT_ARRAY_100[100]; 120 //typedef int *(*PFun)(int,char*); 121 else 122 { 123 mark = i; 124 do 125 { 126 for(n++;pl[i]!=0x20 && pl[i]!=0x09 && n<64 && pl[i]!=';' && pl[i];n++,i++)dtP->otp[n] = pl[i]; 127 for(;pl[i]==0x20 || pl[i]==0x09;i++)mark = i;//mark点 ,跳过空格和tab 128 if(pl[i]==';') 129 { 130 k = i;//初始化 131 //在末尾使用了Space tab符号。 [[typedef char BOOL ;]] 132 if(mark == (i-1)) 133 { 134 while(pl[mark]==0x20 || pl[mark]==0x09)mark--; 135 k = mark+1; 136 while(mark && pl[mark]!=0x20 && pl[mark]!=0x09)mark--; 137 mark++; 138 } 139 for(s=0;mark<k;mark++,s++)temp[s] = pl[mark]; 140 dtP->nvar = strdup(temp);//新变量名称 141 dtP->otp[n] = 0;//旧变量 142 dtP->effect = 1;//常规 143 i++; 144 break; 145 } 146 else if(pl[i]==',')//[[typedef char BOOL,ZJ ;]] 147 { 148 ... 149 break; 150 } 151 else if(pl[i]=='*') 152 { 153 for(i++;pl[i]=='*' || pl[i]==0x20 || pl[i]==0x09;i++); 154 if(pl[i]=='(') 155 { 156 //goto ... 157 } 158 else 159 { 160 161 } 162 } 163 else if(pl[i]=='(') 164 { 165 for(i++;pl[i]==0x20 || pl[i]==0x09;i++); 166 提取名称 167 } 168 //如果遇到[typedef char * PCHAR;]要整理成[typedef char* PCHAR;] 169 else if(mark == (i-1)){n++;dtP->otp[n] = 0x20;...} 170 }while(n<64 && mark); 171 } 172 } 173 174 dtP->next = malloc(sizeof(struct defType)); 175 memset(dtP->next,0,sizeof(struct defType)); 176 177 } 178 //跳过特殊符号 179 for(i++;pl[i]==0x20 || pl[i]==0x09 || pl[i]==0x0d || pl[i]==0x0a;i++); 180 } 181 close(fd); 182 } 183 184 185 void ListFolderContents(const char *root) 186 { 187 DIR *sdir; 188 DWORD attrib; 189 char subdir[512],dupdir[1024]; 190 struct dirent *ptr; 191 struct stat stbuf; 192 193 sdir = opendir(root); 194 195 while((ptr = readdir(sdir))!=NULL) 196 { 197 if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0)continue; 198 //判断是目录还是文件或者链接 199 sprintf(subdir,"%s%s",root,ptr->d_name); 200 lstat(subdir,&stbuf); 201 //printf("[root=%s]\nsubdir: %s stbuf.st_mode=%x isdir=%d\n",root,subdir,stbuf.st_mode,S_ISDIR(stbuf.st_mode)); 202 //Sleep(3000);//调试 203 unsigned len = MultiByteToWideChar(0, 0, subdir, strlen(subdir), NULL, 0); 204 if (len == 0) return printf("error ---001----------\n"); 205 else 206 { 207 memset(dupdir,0,1024); 208 len = MultiByteToWideChar(0, 0, subdir, strlen(subdir), dupdir, len); 209 if (len == 0) return printf("error ---002----------\n"); 210 } 211 printf("%s\n",subdir);//遍历输出全部的文件 212 //Sleep(1000); 213 attrib = GetFileAttributesW(dupdir); 214 //printf("[attrib=%d][attrib=%ul]\n",attrib,attrib); 215 //遍历子目录 216 //if(S_ISDIR(stbuf.st_mode)) //linux 217 if(attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0) 218 { 219 strcat(subdir,"\\"); 220 ListFolderContents(subdir); 221 } 222 } 223 closedir(sdir); 224 } 225 226 227 int main(int argc, char *argv[]) 228 { 229 int len; 230 static char ServicePath[512]; 231 232 memset(dT,0,sizeof(struct defType)); 233 dtP = &dT; 234 235 if( !GetModuleFileName( GetModuleHandle(NULL), ServicePath, 256 ) ) 236 { 237 return printf("Cannot install service (%d)\n", GetLastError()); 238 } 239 for(len=strlen(ServicePath);len>0;len--) 240 if(ServicePath[len]==0x5c){ServicePath[len+1]=0;break;} 241 242 ListFolderContents(ServicePath);//windows 243 244 }
Serious. Nonsense