|
|
1.1 ! root 1: /*% cyntax % && cc -go # % ! 2: * block up paragraphs, possibly with indentation ! 3: */ ! 4: #include <libc.h> ! 5: #include <stdio.h> ! 6: #include <ctype.h> ! 7: int indent=0; /* how many spaces to indent */ ! 8: int length=70; /* how many columns per output line */ ! 9: main(argc, argv) ! 10: char *argv[]; ! 11: { ! 12: register i; ! 13: register FILE *f; ! 14: for(i=1;i!=argc && argv[i][0]=='-';i++){ ! 15: switch(argv[i][1]){ ! 16: case 'i': ! 17: if(argv[i][2]) ! 18: indent=atoi(argv[i]+2); ! 19: else if(i+1<argc){ ! 20: indent=atoi(argv[i+1]); ! 21: i++; ! 22: } ! 23: else ! 24: goto Usage; ! 25: break; ! 26: case 'w': ! 27: case 'l': ! 28: if(argv[i][2]) ! 29: length=atoi(argv[i]+2); ! 30: else if(i+1<argc){ ! 31: length=atoi(argv[i+1]); ! 32: i++; ! 33: } ! 34: else ! 35: goto Usage; ! 36: break; ! 37: default: ! 38: Usage: ! 39: fprintf(stderr, ! 40: "Usage: %s [-i number] [-l number] [file ...]\n", ! 41: argv[0]); ! 42: exit(1); ! 43: } ! 44: } ! 45: if(length<=indent){ ! 46: fprintf(stderr, "%s: line length<=indentation\n", argv[0]); ! 47: exit(1); ! 48: } ! 49: if(i==argc) ! 50: fmt(stdin); ! 51: else{ ! 52: for(;i!=argc;i++){ ! 53: f=fopen(argv[i], "r"); ! 54: if(f==0) ! 55: perror(argv[i]); ! 56: else{ ! 57: fmt(f); ! 58: fclose(f); ! 59: if(i!=argc-1) ! 60: putchar('\n'); ! 61: } ! 62: } ! 63: } ! 64: exit(0); ! 65: } ! 66: fmt(f) ! 67: register FILE *f; ! 68: { ! 69: register c; ! 70: while((c=getc(f))!=EOF) ! 71: outchar(c); ! 72: flush(); ! 73: } ! 74: #define TAB 8 ! 75: #define NWORD (TAB*32) ! 76: char word[NWORD+1]; ! 77: char *wp=word; ! 78: int col=0; /* output column number */ ! 79: int bol=1; /* at beginning of output line? */ ! 80: int punct=0; /* last character out was punctuation? */ ! 81: int newline=1; /* last char read was newline(1) or init space(2) */ ! 82: outchar(c){ ! 83: switch(c){ ! 84: case '\0': ! 85: break; ! 86: case '\n': ! 87: switch(newline){ ! 88: case 0: ! 89: outword(); ! 90: break; ! 91: case 1: ! 92: flush(); ! 93: case 2: ! 94: putchar('\n'); ! 95: wp=word; ! 96: } ! 97: newline=1; ! 98: break; ! 99: case ' ': ! 100: case '\t': ! 101: switch(newline) { ! 102: case 0: ! 103: outword(); ! 104: break; ! 105: case 1: ! 106: flush(); ! 107: newline=2; ! 108: case 2: ! 109: do { ! 110: addchar(' '); ! 111: } while(c=='\t' && (wp-word)%TAB); ! 112: } ! 113: break; ! 114: default: ! 115: addchar(c); ! 116: newline=0; ! 117: } ! 118: } ! 119: addchar(c) ! 120: { ! 121: if(wp==&word[NWORD]) { ! 122: if(strchr(" \t",wp[-1])) ! 123: wp=word; ! 124: outword(); ! 125: } ! 126: *wp++=c; ! 127: } ! 128: outword(){ ! 129: register i; ! 130: if(wp==word) ! 131: return; ! 132: if(wp-word+col+(bol?0:punct?2:1)>length){ ! 133: putchar('\n'); ! 134: col=0; ! 135: bol=1; ! 136: } ! 137: if(col==0){ ! 138: for(i=0;i+8<=indent;i+=8) ! 139: putchar('\t'); ! 140: while(i++<indent) ! 141: putchar(' '); ! 142: col=indent; ! 143: } ! 144: if(bol) ! 145: bol=0; ! 146: else{ ! 147: if(punct){ ! 148: putchar(' '); ! 149: col++; ! 150: } ! 151: putchar(' '); ! 152: col++; ! 153: } ! 154: *wp='\0'; ! 155: puncttest(); ! 156: printf("%s", word); ! 157: col+=wp-word; ! 158: wp=word; ! 159: } ! 160: /* is the word followed by major punctuation, .?:! */ ! 161: /* disregard short things followed by periods; they are probably ! 162: initials or titles like Mrs. and Dr. */ ! 163: puncttest() ! 164: { ! 165: char *ep; ! 166: punct = 0; ! 167: for(ep=wp; --ep>=word; ) { ! 168: switch(*ep) { ! 169: case ')': case '\'': case '"': ! 170: continue; ! 171: case '.': ! 172: if(isupper(*word)&&ep-word<=3) ! 173: return; ! 174: case '?': case ':': case '!': ! 175: punct = 1; ! 176: default: ! 177: return; ! 178: } ! 179: } ! 180: } ! 181: flush(){ ! 182: outword(); ! 183: if(col!=0){ ! 184: putchar('\n'); ! 185: col=0; ! 186: bol=1; ! 187: } ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.