2013年7月9日火曜日

where grep プログラム



grepみたいなものを自分で作ったよん

netwalkerでは何故か動かなかったけど
dynabookAZでは動いた

実行例:

/usr/include内でatoiという関数がどのファイルに
あるか調べる

結果はstdlib.h

プログラム名は、whg(whg.c)

akira@akira-laptop:~/ii1302$ whg
検索する場所:/usr/include
ss=/usr/include
サブディレクトリも検索する[y/n]:n
サブディレクトリは検索しない
検索する言葉:atoi
tt=atoi

0001: 147行 extern int atoi (const char *__nptr)     [/usr/include/stdlib.h]
0002: 278行 __NTH (atoi (const char *__nptr))     [/usr/include/stdlib.h]
akira@akira-laptop:~/ii1302$






akira@akira-laptop:~$ cat whg.c


#include <sys/syscall.h>
#include <unistd.h>

#ifdef __linux__
# include <linux/types.h>
/* # include <linux/dirent.h> */
# include <linux/unistd.h>
# include <errno.h>
#else
# include <dirent.h>
#endif

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

struct dirent {
   long d_ino;
   off_t d_off;
   unsigned short d_reclen;
   char d_name[256];
};

struct stat buf2;
char *search(char *text,char *key);
int kensaku(char *ss);

long cnt=0;
char tt[100];
int j;
int ynflg;
int overflg=0;

int main(){
   int i,im,d_size;
   int fd;
   char buf[4096],ch;
   char ss[500],*p;
   char yn[20];

   printf("検索する場所:");

   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         ss[im]=ch;
         im++;
      }
   }
   ss[im]='\0';
   if(strcmp(ss,"")==0) strcpy(ss,".");
   printf("ss=%s\n",ss);

   printf("サブディレクトリも検索する[y/n]:");
   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         yn[im]=ch;
         im++;
      }
   }
   yn[im]='\0';
   if(yn[0]=='n'||yn[0]=='N') ynflg=0;
   else ynflg=1;
 
   if(ynflg==1) printf("サブディレクトリも検索\n");
   if(ynflg==0) printf("サブディレクトリは検索しない\n");

   printf("検索する言葉:");

   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         tt[im]=ch;
         im++;
      }
   }
   tt[im]='\0';
   printf("tt=%s\n",tt);
   printf("\n");

   j=1;
   kensaku(ss);

}

int kensaku(char *ss){
   long gyo;
   int i,im,d_size,k,pos;
   int fd;
   char buf[4096],ss1[100][500];
   char *p,text[4096],q;
   FILE *fp;

   j++;
   /*printf("j=%d ss=%s\n",j,ss);*/
   if(cnt>=100){ goto OVER200; }

   if((fd=open(ss,O_RDONLY))<0){
      perror("open");
      j--;
      return 1;
   }

   while((d_size=syscall(SYS_getdents,fd,(struct dirent *)&buf,sizeof buf))>0){
      for(i=0;i<d_size;i+=((struct dirent *)&buf[i])->d_reclen){
         strcpy(ss1[j],ss);
         strcat(ss1[j],"/");
         strcat(ss1[j],((struct dirent *)&buf[i])->d_name);
         if(stat(ss1[j],&buf2)<0){
              perror("stat");
              j--;
              return 1;
         }
         if((buf2.st_mode&0xf000)==0x4000&&
             ss1[j][strlen(ss1[j])-1]!='.'&&

             /* 検索対象外を予め作っておく */

             strcmp(ss1[j],"./processing")!=0&&
             strcmp(ss1[j],"./src/mozc/src")!=0&&
             strcmp(ss1[j],"./depot_tools")!=0&&
             strcmp(ss1[j],"./mozc-tmp/mozc-ut-1.1.773.102")!=0&&
             strcmp(ss1[j],"./mozc-tmp/mozcdic-ut-20110803")!=0&&
             strcmp(ss1[j],"./ダウンロード/mozc_test1")!=0&&
             strcmp(ss1[j],"./.mozilla/firefox")!=0&&
             strcmp(ss1[j],"./.gconf/apps")!=0&&
             strcmp(ss1[j],"./.libreoffice")!=0&&
             strcmp(ss1[j],"./gtk")!=0&&
             strcmp(ss1[j],"./.cache")!=0&&
             strcmp(ss1[j],"./.local")!=0&&
             strcmp(ss1[j],"./.config")!=0&&
             strcmp(ss1[j],"./kde")!=0){

             /* 検索対象外を予め作っておく、ここまで */

             k=0;
             if(ynflg==1) k=kensaku(ss1[j]);
             if(k==1){ j--; return 1;}
         }

         fp=fopen(ss1[j],"r");
         if(fp!=NULL){
            gyo=1;
            while( (q=getc(fp)) != 0xff){
               if(q=='\n'){
                  text[pos]='\0';
                  p=search(text,tt);
                  if(p!=NULL&&cnt<100){
                      cnt++;
                      printf("%04ld: %ld行 %s     [%s]\n",cnt,gyo,text,ss1[j]);
                  }
                  pos=0;
                  gyo++;
               }
               else{
                  if(pos>=4096) break;
                  if(q!='\r') text[pos++]=q;
               }
            }
            text[pos]='\0';
         }
         else return 2;

         fclose(fp);


      }
      if(cnt>=100){
          if(overflg==0) printf("検索数が100を超えるので中止します\n");
          overflg=1;
          goto OVER100; }
   }
OVER100:
   if(d_size<0){
      perror("getdents");
      j--;
      return 1;
   }
OVER200:
   j--;
   return 0;
}


char *search(char *text,char *key){

   int m,n;
   char *p;

   m=strlen(text);
   n=strlen(key);
   for(p=text;p<=text+m-n;p++){
      if(strncmp(p,key,n)==0) return p;
   }
   return NULL;
}


akira@akira-laptop:~$

0 件のコメント:

コメントを投稿