|
|
1.1 root 1: /* NOTICE-NOT TO BE DISCLOSED OUTSIDE BELL SYS EXCEPT UNDER WRITTEN AGRMT */
2: /* Writer's Workbench version 2.0, January 1981 */
3: #include<stdio.h>
4: #define min(a,b) (a>b?b:a)
5: #define MAXWORDS 200
6: #define MAXCHAR 2000
7: #define MAJOR 7
8: char buf[MAXCHAR];
9: char *bptr;
10: struct word{
11: int brklvl;
12: char *string;
13: };
14: struct word line[MAXWORDS];
15: struct word *fst;
16: struct word *lst;
17:
18: main(){
19: int l;
20: struct word *ptr;
21: do{
22: lst=fst= &line[0];
23: bptr = buf;
24: l=readline();
25: findbrk();
26: if(fst != lst){
27: divide();
28: writes();
29: }
30: } while(l != EOF);
31: }
32:
33:
34: readline()
35: {
36: int flag;
37: do{
38: lst->string = bptr;
39: flag=getword();
40: if(lst->string == bptr)
41: break;
42: lst++;
43: } while(flag == 1 && lst <= &line[MAXWORDS]);
44: return(flag);
45: }
46:
47:
48: getword()
49: {
50: int c,i;
51: int ret;
52: lst->brklvl = 0;
53: ret = 1;
54: for(i=0;i < MAXCHAR-1; ++i){
55: c= *bptr++ = getchar();
56: switch(c){
57: case '.':
58: case '?':
59: case '!':
60: lst->brklvl=5;
61: ret = 0;
62: goto done;
63: case ';':
64: case ':':
65: lst->brklvl=4;
66: goto done;
67: case ',':
68: lst->brklvl=3;
69: goto done;
70: case ' ':
71: case '\t':
72: case '\n':
73: --bptr;
74: if(bptr==lst->string) {
75: break;
76: }
77: lst->brklvl=0;
78: goto done;
79: case EOF:
80: --bptr;
81: if(bptr==lst->string){
82: lst->brklvl=0;
83: return(EOF);
84: }
85: lst->brklvl=0;
86: ret = EOF;
87: goto done;
88:
89: }
90: }
91: done:
92: *bptr++='\0';
93: return(ret);
94: }
95:
96:
97: int m[6] = {7,7,7,5,5,0};
98: divide()
99: {
100: struct word *ptr;
101: int i,pc,ba[3][20],j,np,ct,nct,jct;
102: i=0;
103: j=1;
104: for(ptr=fst;ptr <lst;ptr++){
105: if(ptr->brklvl != 0){
106: ba[0][i]=j;
107: ba[1][i]=ptr->brklvl;
108: i++;
109: }
110: j++;
111: }
112: pc = i;
113: for(np=pc-1;np>0;np--) ba[2][np]=ba[0][np]-ba[0][np-1];
114: ba[2][0]=ba[0][0];
115:
116: ct=0;
117: for (i=0;i<pc-1;i++){
118: ct=ct+ba[2][i];
119: while (ct >7){
120: if (ct <= 10) {
121: (fst+(ba[0][i]-1))->brklvl=6;
122: ct=0;
123: }
124: else {
125: nct = ct/2;
126: if (nct > 7) nct =7;
127: (fst + (ba[0][i] - ct + nct) )->brklvl = 6;
128: ct = ct - nct;
129: }
130: }
131: if(ct >2){
132: jct=0;
133: for(j=i+1;j<pc;j++){
134: jct=jct+ba[2][j];
135: if(jct >min(m[ba[1][i]],7-ct)){
136: (fst+(ba[0][i]-1))->brklvl=6;
137: ct=0;
138: break;
139: }
140: else if(ba[1][i] <=ba[1][j]) break;
141: }
142: }
143: }
144: }
145: writes()
146: {
147: struct word *ptr;
148: for(ptr=fst;ptr <lst; ptr++){
149: printf("%s ",ptr->string);
150: if(ptr->brklvl>=5)putchar('\n');
151: }
152: }
153:
154: char *wds[]={
155: "and",
156: "is",
157: "at",
158: "but",
159: "or",
160: "if",
161: "because",
162: "since",
163: "to", /* beginning of minor wds*/
164: "in",
165: "that",
166: "for",
167: "with",
168: "on",
169: "by",
170: "from",
171: "which",
172: "would",
173: "when",
174: "what",
175: "into",
176: "than",
177: "could",
178: "may",
179: "where",
180: "through",
181: "how",
182: "between",
183: "without",
184: "why",
185: "among",
186: "beside",
187: "besides",
188: 0
189: };
190:
191: findbrk(){
192: struct word *ptr;
193: int ret;
194: char **p;
195: ret=0;
196: for(ptr=fst; ptr< lst; ptr++){
197: for(p=wds;*p!=0;p++){
198: if(strcmp(ptr->string,*p)== 0){
199: if((ptr-1)->brklvl!=3){
200: if(p > &wds[MAJOR])
201: (ptr-1)->brklvl=1;
202: else (ptr-1)->brklvl = 2;
203: }
204: ret=1;
205: break;
206: }
207: }
208: }
209: return(ret);
210: }
211:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.