免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2495 | 回复: 2
打印 上一主题 下一主题

[函数] 高手帮我看个代码 主要看gettok这个函数的tok [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-25 00:50 |只看该作者 |倒序浏览
smallsh.h


  1. #define ARG 2
  2. #define AMPERSAND 3
  3. #define SEMICOLON 4
  4. #define MAXARG 512
  5. #define MAXBUF 512
  6. #define FOREGROUND 0
  7. #define BACKGROUND 1

  8. extern char inpbuf[MAXBUF], tokbuf[2*MAXBUF];

  9. extern char        * ptr;
  10. extern char * tok;

  11. extern int userin(char *p);
  12. extern int gettok(char **outptr);
  13. extern int procline(void);
  14. extern int inarg(char c);
  15. extern int runcommand(char **cline,int where);
复制代码


main.c


  1. #include "smallsh.h"


  2. char *prompt = "Command>";
  3. int main(void)
  4. {

  5.          
  6. while(userin(prompt) != EOF)
  7.                   procline();
  8. }
复制代码


procline.c


  1. #include "smallsh.h"

  2. int procline(void)
  3. {
  4.          char *arg [MAXARG+1];
  5.          int toktype;
  6.          int narg;
  7.          int type;
  8.          
  9.          narg = 0;
  10.          for(;;)
  11.          {
  12.                   switch(toktype = gettok(&arg[narg]))
  13.                   {
  14.                   case ARG:
  15.                            if(narg < MAXARG)
  16.                                         narg++;
  17.                            break;
  18.                   case EOL:
  19.                   case SEMICOLON:
  20.                   case AMPERSAND:
  21.                   if(toktype == AMPERSAND)
  22.                            type = BACKGROUND;
  23.                   else
  24.                            type = FOREGROUND;
  25.             
  26.                   if(narg != 0)
  27.                   {
  28.                            arg[narg] = NULL;
  29.            int idx=0;
  30.            for(;arg[idx]!=NULL;printf("[ %s ]\n",arg[idx]),idx++);
  31.             
  32.                            runcommand(arg,type);
  33.                   }
  34.                   if(toktype == EOL)
  35.                            return;
  36.                   narg = 0;
  37.                   break;
  38.                   }
  39.          }
  40. }
复制代码


runcommand.c


  1. #include "smallsh.h"

  2. int runcommand(char **cline, int where)
  3. {
  4.          pid_t pid;
  5.          int status;
  6.          
  7.          switch(pid = fork())
  8.          {
  9.          case -1:
  10.                   perror("smallsh");
  11.                   return(-1);
  12.          case 0:
  13.                   execvp(*cline,cline);
  14.                   perror(*cline);
  15.                   exit(1);
  16.                   
  17.          }
  18.          
  19.          if(where == BACKGROUND)
  20.          {
  21.                   printf("[process id %d]\n",pid);
  22.                   return(0);
  23.          }
  24.          if(waitpid(pid,&status,0) == -1)
  25.                   return (-1);
  26.          else
  27.                   return (status);
  28. }

复制代码


userin.c


  1. #include "smallsh.h"
  2. static char inpbuf[MAXBUF],tokbuf[2*MAXBUF],*ptr = inpbuf,*tok = tokbuf;


  3. int userin(char *p)
  4. {
  5.          char c;int count;

  6.          ptr=inpbuf;
  7.          tok=tokbuf;   
  8.          printf("%s",p);
  9.          
  10.          count = 0;
  11.          
  12.          while(1)
  13.          {
  14.                   if((c = getchar()) == EOF)
  15.                            return(EOF);
  16.            if(count < MAXBUF )
  17.                            inpbuf[count++] = c;
  18.            if(c=='\n' && count<MAXBUF){ inpbuf[count]='\0';
  19.                     return count;}
  20.         if(c == '\n')
  21.              {
  22.                    printf("smallsh: input line too long \n");
  23.                    count = 0;
  24.                    printf("%s",p);        
  25.               }
  26. }
  27. }
  28. int gettok(char **outptr)
  29. {
  30.          int type;
  31.          *outptr = tok;
  32.          while(*ptr == ' ' || *ptr == '\t')
  33.                   ptr++;
  34.          *tok++ = *ptr;
  35.          

  36.          switch(*ptr++)
  37.          {
  38.          case '\n':
  39.                   type = EOL;         
  40.                   break;
  41.          case '&':
  42.               type= AMPERSAND;
  43.              break;
  44.          case ';':
  45.                   type= SEMICOLON;      
  46.                   break;
  47.          default:
  48.                   type = ARG;
  49.                   while(inarg(*ptr))
  50.                            *tok++ = *ptr++;
  51.          }
  52.          *tok++ = '\0';
  53.          return type;
  54. }

复制代码


inarg.c


  1. static char special[] = {' ','\t','&',';','\n','\0'};

  2. int inarg(char c)
  3. {
  4.          char *wrk;
  5.          for(wrk = special;*wrk;wrk++)
  6.          {
  7.                   if(c == *wrk)
  8.                            return(0);
  9.          }
  10.          return (1);
  11. }

复制代码


makefile


  1. smallsh: main.o userin.o inarg.o runcommand.o procline.o
  2.         gcc -g  main.o userin.o inarg.o runcommand.o procline.o -o smallsh
  3. main.o:main.c   
  4.         gcc -g -c  main.c
  5. userin.o: userin.c
  6.         gcc -g -c  userin.c
  7. runcommand.o: runcommand.c  
  8.         gcc -g -c  runcommand.c
  9. procline.o: procline.c  
  10.         gcc -g -c  procline.c
  11. inarg.o: inarg.c
  12.         gcc -g -c  inarg.c
复制代码


我实在想不通为什么是 tokbuf[2*MAXBUF]  而不是tokbuf[MAXBUF]
在 int gettok(char **outptr)
这个函数中*tok++ =*ptr++ 而且参数char **outptr指向了tok 不管怎么讲tokbuf长度最终最长也就MAXBUF阿
为什么程序里是tokbuf[2*MAXBUF]

论坛徽章:
0
2 [报告]
发表于 2007-03-25 10:30 |只看该作者
帮忙顶顶

论坛徽章:
0
3 [报告]
发表于 2007-03-26 21:20 |只看该作者
ding...........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP