home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 375.lha / LF / lf.c < prev    next >
C/C++ Source or Header  |  1990-05-02  |  4KB  |  221 lines

  1. /****************************************************************
  2.  *                                *
  3.  * lf.c - list functions in a c source file        V1.1    *
  4.  *                                *
  5.  * (c) 1989 Jeff Bevis                        *
  6.  *                                *
  7.  ****************************************************************
  8.  *                                *
  9.  * Command line options                        *
  10.  *                                *
  11.  * -s    Suppress line number printing.                *
  12.  * -c    Format output for C function declarations        *
  13.  * -n    Force normal formatting                    *
  14.  *                                 *
  15.  ****************************************************************/
  16.  
  17.  
  18. #include <stdio.h>
  19.  
  20. FILE *s;
  21. char c,buf[400],cget();
  22. int mode,col,linecount;
  23. char    c_flag,s_flag,nofile;
  24.  
  25. main(argc,argv)
  26. int argc;
  27. char **argv;
  28. {
  29.  int t;
  30.  
  31.  if(argc>1)
  32.   {
  33.    for(t=1;t<argc;t++)
  34.     {
  35.      if(*argv[t]=='-')
  36.       {
  37.        int s;
  38.  
  39.        for(s=1;s<strlen(argv[t]);s++)
  40.     {
  41.      switch(*(argv[t]+s))
  42.       {
  43.        case 's':    s_flag++; break;
  44.        case 'c':    c_flag++; break;
  45.        case 'n':    s_flag=0;
  46.             c_flag=0; break;
  47.        default:    if(!c_flag) printf("Unrecognized option: %c\n",*(argv[t]+s));
  48.       }
  49.     }
  50.        continue;
  51.       }
  52.      s=fopen(argv[t],"r");
  53.      if(s)
  54.       {
  55.        if(c_flag) printf("/*\n * Functions from %s\n */\n",argv[t]);
  56.        else printf("FILE: %s\n",argv[t]);
  57.        find();
  58.        fclose(s);
  59.       }
  60.      else
  61.       {
  62.        if(c_flag) printf("/* FILE: %s NOT PRESENT! */\n",argv[t]);
  63.        else printf("Can't open file %s.\n",argv[t]);
  64.       }
  65.     }
  66.   }
  67.  else
  68.   {
  69.    if(c_flag) printf("/* No files specified for lf */\n");
  70.    else printf("You must specify a C source file.\n");
  71.    exit(10);
  72.   };
  73. }
  74.  
  75. find()
  76. {
  77.  int comlev=0,depth=0,cnt=0;
  78.  
  79.  linecount=0;
  80.  col=0;
  81.  c=0;
  82.  
  83.  while(c!=EOF)
  84.   {
  85.    c=cget(s);
  86.    if(comlev==1 && c!='*') comlev=0;
  87.  
  88.    switch(c)
  89.     {
  90.      case '\n':    buf[cnt]='\0';
  91.         think(cnt);
  92.         cnt=0;
  93.         break;
  94.      case '#':    if(col==1) readtoeol();   /* skip over preprocessor lines */
  95.         break;
  96.      case '\\': c=cget(s);
  97.         break;
  98.      case '/':    comlev=1;
  99.         break;
  100.      case '*':    if(comlev==1) readto_eocomment();
  101.         break;
  102.      case '\"': readto_eoquote();
  103.         break;
  104.      case '\'':    readto_eochar();
  105.         break;
  106.      case '{':    depth++;
  107.         break;
  108.      case '}':    depth--;
  109.         break;
  110.     }
  111.    if(depth==0 && comlev==0 && c!=EOF && c!='\n') buf[cnt++]=c;
  112.   }
  113. }
  114.  
  115. readtoeol()
  116. {
  117.  c=cget(s);
  118.  while(c!=EOF && c!='\n') c=cget(s);
  119. }
  120.  
  121. readto_eocomment()
  122. {
  123.  c=cget(s);
  124.  
  125.  while(c!=EOF)
  126.   {
  127.    if(c=='*')
  128.     {
  129.      c=cget(s);
  130.      if(c=='/') return;
  131.     }
  132.    else c=cget(s);
  133.   }
  134. }
  135.  
  136. readto_eoquote()
  137. {
  138.  c=cget(s);
  139.  while(c!=EOF && c!='\"') c=cget(s);
  140. }
  141.  
  142. readto_eochar()
  143. {
  144.  c=cget(s);
  145.  while(c!=EOF && c!='\'') c=cget(s);
  146. }
  147.  
  148. think(cnt)
  149. {
  150.  int z;
  151.  z=cnt;
  152.  
  153.  if(z>2)
  154.   {
  155.    z--;
  156.    while((buf[z]==' ' || buf[z]=='\t') && z>1) z--;
  157.    buf[z+1]='\0';
  158.    if(buf[z]==')')
  159.     {
  160.      if(c_flag)
  161.       {
  162.        int tc,r,tspot=0,vd=1,validchar=0,checknow=0;
  163.  
  164.        for(r=z;r>0;r--)        /* find first space before function parentheses */
  165.         {
  166.          if(buf[r]==' ' || buf[r]=='\t')    /* if a whitespace */
  167.       {
  168.        if(validchar)    /* and we're ready to accept one */
  169.         {
  170.          tspot=r;        /* remember the tab-spot */
  171.          vd=0;
  172.          break;        /* leave loop */
  173.         }
  174.       }
  175.      else if(checknow) validchar=1;      /* if first non-space before parentheses, must be function name.  OK to look for leading space now */
  176.      else if(buf[r]=='(') checknow=1; /* see if we left the function parentheses */
  177.     }
  178.        for(r=tspot;r<=z;r++)    /* find leftmost parentheses of function decl after tspot */
  179.     {
  180.      if(buf[r]=='(')
  181.       {
  182.        buf[r+1]=')';
  183.        buf[r+2]='\0';
  184.        break;
  185.       }
  186.     }
  187.        if(vd) printf("void\t\t\t%s;\n",buf);
  188.        else
  189.     {
  190.      for(r=0;r<tspot;r++) putchar((int)buf[r]);
  191.      tc=3-(tspot>>3);        /* tab size of 8, 2^3) */
  192.      for(r=0;r<tc;r++) putchar('\t');
  193.      printf("%s;\n",buf+tspot+1);
  194.     }
  195.       }
  196.      else if(s_flag) printf("%s\n",buf);    /* no line num */
  197.      else printf("\t%4d: %s\n",linecount,buf);    /* default mode */
  198.      return;
  199.     }
  200.   }
  201. }
  202.  
  203. char cget(f)
  204. FILE *f;
  205. {
  206.  char c;
  207.  c=getc(f);
  208.  if(c=='\n') 
  209.   {
  210.    linecount++;
  211.    col=0;
  212.   }
  213.  else col++;
  214.  if(c=='\\')        /* if escape slash is read, */
  215.   {
  216.    c=getc(f);        /* get char after escape */
  217.    return(cget(f));    /* return next non-escape char after that */
  218.   }
  219.  return(c);
  220. }
  221.