LCC解读笔记

来源:互联网 发布:软件设计师证书 编辑:程序博客网 时间:2024/05/20 21:58

基础函数:

缓冲定义:

static unsigned char buffer[MAXLINE+1 + BUFSIZE+1];

MAXLINE是作为缓冲,当未处理完所有缓冲时,复制未读完的数据,在fillbuf可以看到应用。

获取下一行

 

view plaincopy to clipboardprint?
  1. void nextline(void) {  
  2. do {  
  3. if (cp >= limit) {  
  4. fillbuf();  
  5. if (cp >= limit)  
  6. cp = limit;  
  7. if (cp == limit)  
  8. return;  
  9. else {  
  10. lineno++;  
  11. for (line = (char *)cp; *cp==' ' || *cp=='/t'; cp++)  
  12. ;  
  13. if (*cp == '#') {  
  14. resynch();  
  15. nextline();  
  16. }  
  17. }  
  18. while (*cp == '/n' && cp == limit);  
  19. }  
 

 

读取缓冲

 

view plaincopy to clipboardprint?
  1. void fillbuf(void) {  
  2. if (bsize == 0)  
  3. return;  
  4. if (cp >= limit)  
  5. cp = &buffer[MAXLINE+1];  // 读完  
  6. else  
  7. // 未读完  
  8. int n = limit - cp;  
  9. unsigned char *s = &buffer[MAXLINE+1] - n;  
  10. assert(s >= buffer);  
  11. line = (char *)s - ((char *)cp - line);  
  12. while (cp < limit)  
  13. *s++ = *cp++;  
  14. cp = &buffer[MAXLINE+1] - n;  
  15. }  
  16. if (feof(stdin))  
  17. bsize = 0;  
  18. else  
  19. bsize = fread(&buffer[MAXLINE+1], 1, BUFSIZE, stdin); // 读文件到缓冲  
  20. if (bsize < 0) {  
  21. error("read error/n");  
  22. exit(EXIT_FAILURE);  
  23. }  
  24. limit = &buffer[MAXLINE+1+bsize];    // 设置缓冲尾部  
  25. *limit = '/n';  
  26. }  
 

 

输入初始化

 

view plaincopy to clipboardprint?
  1. void input_init(int argc, char *argv[]) {  
  2. static int inited;  
  3. if (inited)  
  4. return// 只初始化一次  
  5. inited = 1;  
  6. main_init(argc, argv); // 主初始化  
  7. limit = cp = &buffer[MAXLINE+1];  
  8. bsize = -1;  
  9. lineno = 0;  
  10. file = NULL;  
  11. fillbuf();  
  12. if (cp >= limit)  
  13. cp = limit;  
  14. nextline(); // 读一行  
  15. }  
  16.   
  17.   
  18. iden预处理  
  19. static void ident(void) {  
  20. while (*cp != '/n' && *cp != '/0')  
  21. cp++;  
  22. }  
 

 

预处理

 

view plaincopy to clipboardprint?
  1. /* resynch - set line number/file name in # n [ "file" ], #pragma, etc. */  
  2. static void resynch(void) {  
  3. for (cp++; *cp == ' ' || *cp == '/t'; )  
  4. cp++;  
  5. if (limit - cp < MAXLINE)  
  6. fillbuf();  
  7. if (strncmp((char *)cp, "pragma", 6) == 0) {  
  8. cp += 6;  
  9. pragma();  
  10. else if (strncmp((char *)cp, "ident", 5) == 0) {  
  11. cp += 5;  
  12. ident();  
  13. else if (*cp >= '0' && *cp <= '9') {  
  14. line:   for (lineno = 0; *cp >= '0' && *cp <= '9'; )               // #line 处理,记录文件名以及修正行数  
  15. lineno = 10*lineno + *cp++ - '0';  
  16. lineno--;  
  17. while (*cp == ' ' || *cp == '/t')  
  18. cp++;  
  19. if (*cp == '"') {  
  20. file = (char *)++cp;  
  21. while (*cp && *cp != '"' && *cp != '/n')  
  22. cp++;  
  23. file = stringn(file, (char *)cp - file);  
  24. if (*cp == '/n')  
  25. warning("missing /" in preprocessor line/n");  
  26. if (firstfile == 0)  
  27. firstfile = file;  
  28. }  
  29. else if (strncmp((char *)cp, "line", 4) == 0) {  
  30. for (cp += 4; *cp == ' ' || *cp == '/t'; )  
  31. cp++;  
  32. if (*cp >= '0' && *cp <= '9')  
  33. goto line;  
  34. if (Aflag >= 2)  
  35. warning("unrecognized control line/n");  
  36. else if (Aflag >= 2 && *cp != '/n')  
  37. warning("unrecognized control line/n");  
  38. while (*cp)  
  39. if (*cp++ == '/n')  
  40. if (cp == limit + 1) {  
  41. nextline();  
  42. if (cp == limit)  
  43. break;  
  44. else  
  45. break;  
  46. }