|
|
1.1 ! root 1: /* ! 2: * Turn the warning and error comments into nroff ! 3: * in the form suggested by Fred Buntzen. ! 4: * ! 5: * Input lines are formatted as ! 6: * sort field ! 7: * message ! 8: * message type ! 9: * zero or more comment lines ! 10: * ! 11: * Output lines are formatted as ! 12: * .IP "\fB message \fR" (message type) ! 13: * comment ! 14: * comment ... ! 15: */ ! 16: #include <stdio.h> ! 17: ! 18: enum state { start, startMsg, inMsg, pct, mType, At, bsl, inComm }; ! 19: ! 20: main(argc, argv) ! 21: char *argv[]; ! 22: { ! 23: register enum state state; ! 24: register c; ! 25: char *p, delim; ! 26: ! 27: delim = (NULL == argv[1]) ? '@' : argv[1][0]; ! 28: ! 29: for (state = start; EOF != (c = getchar()); ) { ! 30: switch (state) { ! 31: case start: /* discard sort field */ ! 32: if (c != delim) ! 33: continue; ! 34: printf(".IP \"\\fR"); ! 35: state = startMsg; ! 36: continue; ! 37: ! 38: case startMsg: /* first char of message */ ! 39: if ('.' == c) { ! 40: putchar('\\'); ! 41: putchar('&'); ! 42: } ! 43: state = inMsg; ! 44: ! 45: case inMsg: ! 46: if (delim == c) { ! 47: state = mType; ! 48: printf("\\fR ("); ! 49: continue; ! 50: } ! 51: switch (c) { ! 52: case '\\': ! 53: state = bsl; ! 54: continue; ! 55: case '%': ! 56: state = pct; ! 57: continue; ! 58: ! 59: case '\n': ! 60: state = start; ! 61: printf("\\fR\"\n"); ! 62: continue; ! 63: ! 64: case '\'': ! 65: putchar('\\'); ! 66: } ! 67: break; ! 68: ! 69: case mType: ! 70: if (delim == c) { ! 71: state = At; ! 72: printf(")\"\n"); ! 73: continue; ! 74: } ! 75: else if ('\n' == c) { ! 76: putchar('"'); ! 77: state = start; ! 78: } ! 79: break; ! 80: ! 81: case bsl: ! 82: state = inMsg; ! 83: switch (c) { ! 84: case '\\': ! 85: printf("\\e"); ! 86: continue; ! 87: default: /* to be expanded */ ! 88: putchar('\\'); ! 89: } ! 90: break; ! 91: ! 92: case pct: ! 93: switch (c) { ! 94: case 'c': ! 95: p = "c"; ! 96: break; ! 97: case 'd': ! 98: p = "n"; ! 99: break; ! 100: case 'x': ! 101: p = "0xn"; ! 102: break; ! 103: case 's': ! 104: p = "string"; ! 105: break; ! 106: default: ! 107: continue; ! 108: } ! 109: printf("\\fI%s\\fR", p); ! 110: state = inMsg; ! 111: continue; ! 112: ! 113: case At: ! 114: switch (c) { ! 115: case ' ': /* discard first space */ ! 116: state = inComm; ! 117: continue; ! 118: case '\n': /* back to start */ ! 119: state = start; ! 120: continue; ! 121: default: /* normal output */ ! 122: if (delim == c) ! 123: continue; ! 124: state = inComm; ! 125: } ! 126: break; ! 127: ! 128: case inComm: ! 129: if (delim == c) { ! 130: c = '\n'; ! 131: state = At; ! 132: } ! 133: else if ('\n' == c) ! 134: state = start; ! 135: } ! 136: putchar (c); ! 137: } ! 138: exit(0); ! 139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.