|
|
1.1 root 1: /* %W% */
2: #include <stdio.h>
3: #define R random()
4: #define T 0.125
5: #define CHOOSE(x) (x[R%(sizeof x / sizeof *x)])
6: #define EQ(a,b) (strcmp(a,b)==0)
7: #define LAST(x) (x[strlen(x)-1])
8: #define VOWEL(x) (x=='a'||x=='e'||x=='i'||x=='o'||x=='u')
9: #define N 8
10: typedef struct xyz { char *type;
11: union { struct xyz *x[N];
12: char *s[N]; } list; } *X,XX;
13: typedef struct { char *number,*ending,*tense,*an,*unspec,*passive; } *E,EE;
14:
15: X getxx(),verbal(),comp(),advp(),adjph(),adverb(),adjective(),prep(),vprep();
16: X np(),aux(),vp(),art(),modal(),perf(),prog(),nounal(),sent(),comma();
17: X adjval();
18: char *tense(),*number(),*prefix(),*root();
19:
20: double makeup=.95;
21: static char *adjlist[] = {"concrete","abstract","procedural","real","ideal",
22: "functional","prototype",
23: "effective","capable","incremental",
24: "perceived","associated","interdepartmental",
25: "diverse","characteristic","worst-case",
26: "qualitative","fully automatic","candidate",
27: "consensual","consequential","conjectural",
28: "constructive","initial","cooperative",
29: "essential","methodological","requisite",
30: "historical","situational","political",
31: "prepared","material","defined","well defined",
32: "organizational","projected","overall",
33: "accepted","rejected","corresponding",
34: "committed","environmental","typical","working","timely",
35: "growing","unprecedented","new","renewed","fresh",
36: "rapid","changing","careful","comprehensive","broad",
37: "massive","huge","enormous",
38: "evaluated","discresionary",
39: "durable","beneficial",
40: "maximal","tremendous","minimal",
41: "on-site","standardized","standard",
42: "powerful","natural","necessary",
43: "reasonable","successful",
44: "doubtful","dubious","certain",
45: "unified","different","similar","utilitarian",
46: "realizable","organizable","motivated",
47: "topical","valuable","feasible",
48: "intelligent","deliverable","nontrivial",
49: "worthwhile","complicated",
50: "organized","organizing","progressing",
51: "schedulable","resourceful","commanding",
52: "important","allocatable","temporal",
53: "ponderable","understandable","comprehendable",
54: "past","present","future",
55: "obvious","considerable","finished","completed",
56: "unique","abovementioned",
57: "major","minor","tendentious","activating",
58: "actual","added","adequate","affordable",
59: "analyzable","additional","intuitive",
60: "artificial","good","better",
61: "worse","bad","basic","fundamental","brief",
62: "general","very unique","extreme","most unique",
63: "central","proximate","approximate","collected",
64: "conductable","comtemplatable",
65: "continuing","demonstrable","desirable",
66: "correctable","foreseeable",
67: "discontinued","early","beginning",
68: "effectuated","elucidated","emotional",
69: "enclosed","enthused","entire","exact",
70: "experimental","fearful","final",
71: "following","informative",
72: "full","complete","indicated","authorized",
73: "modularized","submodularized",
74: "particular","preferred","satisfactory",
75: "measurable","referenced","literal",
76: "modified",
77: "correct","prioritized","prolonged",
78: "regrettable","apparent",
79: "continued","subsequent","sufficient",
80: "suggestive","true","ultimate","separate",
81: "purposeful","regarded","resulting",
82: "doubtful","evident","interesting","worthy",
83: "uniform",
84: "vital","viable",
85: "worthwhile","alternative",
86: "sophisticated","employed",
87: "clear","lucid","simple","perspicuous",
88: "incomplete","concerned"};
89:
90: random() {
91: long lrand();
92: static short tab[31];
93: static short i;
94: i=(lrand()>>15) & 32767;
95: return tab[i%31]=32767-tab[i%31]^i;
96: }
97:
98: X nomq(env) E env; {
99: X v=getxx();
100: v->type="-nomq";
101: if(EQ(env->number,"sing")) {
102: if(EQ(tense(),"past"))v->list.s[0]="there was";
103: else v->list.s[0]="there is";
104: }
105: else {
106: if(EQ(tense(),"past"))v->list.s[0]="there were";
107: else v->list.s[0]="there are";
108: }
109: if(prob(0.2))v->list.s[1]=" not";
110: return v;
111: }
112: X rel(env) E env; {
113: static char *c[] = {"that","which"};
114: X v=getxx();
115: v->type="-rel";
116: v->list.s[0]=CHOOSE(c);
117: return v;
118: }
119:
120: X sent(env) E env; {
121: X sentv=getxx();
122: sentv->type="sent";
123: if(prob(0.09)) {
124: env->unspec="";
125: sentv->list.x[1]=np(env);
126: sentv->list.x[3]=aux(env);
127: sentv->list.x[4]=vp(env);
128: sentv->list.x[0]=nomq(env);
129: sentv->list.x[2]=rel(env);
130: return sentv;
131: }
132: sentv->list.x[0]=np(env);
133: sentv->list.x[1]=aux(env);
134: sentv->list.x[2]=vp(env);
135: return sentv;
136: }
137:
138: X nomy(env) E env; {
139: X v=getxx();
140: v->type="-nomq";
141: v->list.s[0]="the fact that";
142: return v;
143: }
144:
145: X np(env) E env; {
146: X npv=getxx();
147: EE nenv;
148: static EE empty;
149: npv->type="np";
150: if(prob(0.025)) {
151: nenv=empty;
152: npv->list.x[0]=nomy(&nenv);
153: npv->list.x[1]=sent(&nenv);
154: if(env->number==0)env->number="sing";
155: return npv;
156: }
157: npv->list.x[1]=nounal(env);
158: npv->list.x[0]=art(env);
159: return npv;
160: }
161:
162: X aux(env) E env; {
163: X auxv=getxx();
164: int i=0;
165: auxv->type="aux";
166: if(env->tense==0)env->tense=env->ending=tense();
167: if(prob(0.25))auxv->list.x[i++]=modal(env);
168: if(prob(0.25))auxv->list.x[i++]=perf(env);
169: if(prob(0.25))auxv->list.x[i++]=prog(env);
170: return auxv;
171: }
172:
173: X passive(env) E env; {
174: X v=getxx();
175: v->type="-passive";
176: if(env->tense==0)env->tense=env->ending=tense();
177: if(env->number==0)env->number=number();
178: if(EQ(env->ending,"modal"))v->list.s[0]="be";
179: else if(EQ(env->ending,"-en"))v->list.s[0]="been";
180: else if(EQ(env->ending,"-ing"))v->list.s[0]="being";
181: else {
182: if(EQ(env->tense,"past"))
183: v->list.s[0]=EQ(env->number,"sing")?"was":"were";
184: else v->list.s[0]=EQ(env->number,"sing")?"is":"are";
185: }
186: env->passive=env->ending="pass";
187: return v;
188: }
189:
190: X passprep(env) E env; {
191: X v=getxx();
192: v->type="-passprep";
193: v->list.s[0]="by";
194: return v;
195: }
196:
197: X vp(env) E env; {
198: X vpv=getxx();
199: int i=0;
200: vpv->type="vp";
201: if(prob(0.5))vpv->list.x[i++]=passive(env);
202: vpv->list.x[i++]=verbal(env);
203: vpv->list.x[i++]=comp(env);
204: if(prob(0.10))vpv->list.x[i++]=advp(env);
205: return vpv;
206: }
207:
208: X art(env) E env; {
209: static char *aspecsg[] = {"the","the","the","the","the","this","this","that"};
210: static char *aspecpl[] = {"the","the","the","the","the","these","those"};
211: static char *aunssg[] = {"a","a","a","a","a","a","a","much","each","any"};
212: static char *aunspl[] = {"some","a few","a couple","several","many","all",
213: "no",
214: "an undue number of",
215: "a number of"};
216: X artv=getxx();
217: artv->type="-art";
218: if(env->number==0)env->number=number();
219: if(env->unspec==0&&prob(0.33)) {
220: if(EQ(env->number,"sing"))artv->list.s[0]=CHOOSE(aspecsg);
221: else artv->list.s[0]=CHOOSE(aspecpl);
222: }
223: else if(prob(0.50)||env->an&&EQ(env->number,"sing")) {
224: if(EQ(env->number,"sing"))artv->list.s[0]=env->an?"a":CHOOSE(aunssg);
225: else artv->list.s[0]=CHOOSE(aunspl);
226: if(env->an&&EQ(artv->list.s[0],"all"))artv->list.s[0]="";
227: }
228: else artv->list.s[0]="";
229: env->unspec=0;
230: if(env->an&&EQ(env->an,"an")&&EQ(artv->list.s[0],"a"))
231: artv->list.s[0]="an";
232: env->an=0;
233: return artv;
234: }
235:
236: X modal(env) E env; {
237: static char *pres[] = {"can","may","must","shall","will"};
238: static char *past[] = {"could","might","should","would"};
239: X modalv=getxx();
240: modalv->type="-modal";
241: if(env->tense==0)env->tense=env->ending=tense();
242: if(EQ(env->ending,"pres"))modalv->list.s[0]=CHOOSE(pres);
243: else modalv->list.s[0]=CHOOSE(past);
244: env->ending="modal";
245: return modalv;
246: }
247:
248: X perf(env) E env; {
249: X perfv=getxx();
250: perfv->type="-perf";
251: if(env->tense==0)env->tense=env->ending=tense();
252: if(env->number==0)env->number=number();
253: if(EQ(env->ending,"past")) {
254: perfv->list.s[0]="had";
255: }
256: else if(EQ(env->ending,"pres")) {
257: if(EQ(env->number,"sing"))perfv->list.s[0]="had";
258: else perfv->list.s[0]="have";
259: }
260: else perfv->list.s[0]="have";
261: env->ending="-en";
262: return perfv;
263: }
264:
265: X prog(env) E env; {
266: X progv=getxx();
267: progv->type="-prog";
268: if(env->tense==0)env->tense=env->ending=tense();
269: if(env->number==0)env->number=number();
270: if(EQ(env->ending,"pres")) {
271: if(EQ(env->number,"sing"))progv->list.s[0]="is";
272: else progv->list.s[0]="are";
273: }
274: else if(EQ(env->ending,"past")) {
275: if(EQ(env->number,"sing"))progv->list.s[0]="was";
276: else progv->list.s[0]="were";
277: }
278: else if(EQ(env->ending,"-en")) {
279: progv->list.s[0]="been";
280: }
281: else if(EQ(env->ending,"modal")) {
282: progv->list.s[0]="be";
283: }
284: env->ending="-ing";
285: return progv;
286: }
287:
288: X verb(env) E env; {
289: /* they pres, he pres, they past, they perf, they prog, they pass */
290: static char *ends[][6] = {{"ate","ates","ated","ated","ating","ated"},
291: {"en","ens","ened","ened","ening","ened"},
292: {"esce","esces","esced","esced","escing","esced"},
293: {"fy","fies","fied","fied","fying","fied"},
294: {"ize","izes","ized","ized","izing","ized"}};
295: X verbv=getxx();
296: int i;
297: verbv->type="-verb";
298: if(env->tense==0)env->tense=env->ending=tense();
299: if(env->number==0)env->number=number();
300: if(0&&prob(0.1)&&EQ(env->tense,env->ending)) {
301: if(EQ(env->number,"sing")) {
302: if(EQ(env->tense,"pres"))verbv->list.s[0]="is";
303: else verbv->list.s[0]="was";
304: }
305: else {
306: if(EQ(env->tense,"pres"))verbv->list.s[0]="are";
307: else verbv->list.s[0]="were";
308: }
309: }
310: else {
311: verbv->list.s[0]=prefix(env);
312: verbv->list.s[1]=root(env);
313: if(EQ(env->ending,"pres")&&EQ(env->number,"sing"))i=1;
314: else if(EQ(env->ending,"pres")||EQ(env->ending,"modal"))i=0;
315: else if(EQ(env->ending,"past"))i=2;
316: else if(EQ(env->ending,"-en"))i=3;
317: else if(EQ(env->ending,"-ing"))i=4;
318: else if(EQ(env->ending,"pass"))i=5;
319: else i=0;
320: verbv->list.s[2]=ends[R%(sizeof ends/sizeof *ends)][i];
321: }
322: env->ending=0;
323: return verbv;
324: }
325:
326: X noun(env) E env; {
327: static char *suff[] = {"ion","sion","tion","age","ness","ment","ure",
328: "ity","iety","ty","ence","ency","ance",
329: "ancy","tude","hood","ture","ate","art","ard",
330: "ism","ine","stress","trix","ess",
331: "dom","ship","eer","ster","ant","ent","ary",
332: "ery","ory","ette","let","ling","ule","kin",
333: "ar","or","ist",
334: "fulness",
335: "kin","cule","icle","y","ability","iosos"};
336: static char *wordy[] = {"final completion","final ending","final outcome",
337: "adaptation","appearance","argument","circumstance",
338: "confession","confidence","delimitation","dilution",
339: "dissertation","distribution","duplication",
340: "entertainment","equipment","evolution",
341: "existence","expression","generation","impression",
342: "integration","interaction","investment","judgment",
343: "population","provision","solution","statement",
344: "tradition","transmission",
345: "final result","added increment","assistance",
346: "beneficial assistance","mutual cooperation",
347: "projection","future projection",
348: "capability","conjecture","consensus of opinion",
349: "general consensus","absence","deficiency",
350: "inadequacy","insufficience","insufficiency",
351: "growing importance","renewed emphasis",
352: "renewed interest","changing behavior",
353: "critical thinking","careful thinking",
354: "comprehensive survey","high standard",
355: "basic foundation","system testing",
356: "serious discussion","serious concern",
357: "organizational framework","prototype model",
358: "uniform nomenclature","greater cooperation",
359: "uniform consistency","early expectation",
360: "standardization","great similarity",
361: "shortage","presence","sufficiency",
362: "consequent result","construct","disutility",
363: "early beginning","emotional feeling","endeavor",
364: "authorization","order of magnitude","preference",
365: "impact","joint cooperation","joint partnership",
366: "main essential","methodology","modification",
367: "necessary requisite","past history","situation",
368: "effectuation","clarification","new doubt",
369: "policy","encouragement","preparation",
370: "criterion","material","interest","acceptance",
371: "rejection","publication","circulation",
372: "protection","insurance",
373: "assignment","identification",
374: "submission","request",
375: "guidance","correspondence","inclusion",
376: "attachment","assumption",
377: "recommendation","prescription","approval",
378: "discretion","responsibility","relevance",
379: "issuance","termination","total effect",
380: "deleterious effect","consolidation",
381: "aggregation","definiteness","commencement",
382: "actual experience","experience",
383: "combination","accord","filing",
384: "idea","abstraction","method","procedure",
385: "complaint","maintenance","finance","travel",
386: "purchase","repair","routine",
387: "development","cancellation",
388: "partitioning","development effort",
389: "project","automation","multilevel architecture",
390: "multilevel heirarchy","data stream",
391: "objective",
392: "individual assignment","mode of operation",
393: "clear community","attendant interest",
394: "task division","well defined interfacing",
395: "team report","meeting time","effective use",
396: "friction",
397: "major objective","ownership",
398: "overall project time constraint",
399: "functional division","requirements analysis",
400: "code development","charter",
401: "requirements definition","vertical division",
402: "broad range","strong feeling",
403: "considerable latitude","overall project constraint",
404: "sufficient resource","assigned task","expectation",
405: "critical aspect","clear understanding",
406: "computing load","clean interfacing","natural basis",
407: "team activity","team responsibility",
408: "main function","predominant portion",
409: "work plan","major breakpoint","work module",
410: "achievable accuracy","supplementary work",
411: "field version","internal establishment",
412: "internal communication","development progress",
413: "internal meeting","experience level",
414: "high level autonomy","adherence",
415: "feasibility demonstration","persistent problem",
416: "internal objective","idea sharing",
417: "improved performance","unfamiliar methodology",
418: "new methodology","development experience",
419: "module specification","good progress",
420: "optimal number","natural division",
421: "good relationship","cross attendance",
422: "attendance","necessary communication",
423: "evolving organization","basic principle",
424: "complete revision","general information",
425: "primary objective","load-carrying capacity",
426: "necessary revision","major change",
427: "clarified interpretation","subsequent attempt",
428: "basic objective","full utilization",
429: "practical consideration",
430: "proportionate quantity","substantial change",
431: "database design","unified framework",
432: "customer service","strong interest",
433: "unified description","necessary background information",
434: "provisioning","physical coverage","general observation",
435: "new technology","validity determination",
436: "relation","regulation","verification",
437: "impediment","portal","practice","premise",
438: "basis","movement","question",
439: "issue","input","output","observation",
440: "input","output","input","output",
441: "mechanization","function","evaluation",
442: "result","further consideration","category",
443: "performance indicator","early warning",
444: "analysis purpose","measurement","replacement",
445: "utilitarian purpose",
446: "quota","proposed enhancement","enhancement",
447: "interfacing","team organization","module",
448: "guideline","continuing study",
449: "required assistance","major advance",
450: "proposal","hierarchy",
451: "current view","refinement","activity",
452: "external description","tight schedule pressure",
453: "internal conflict","internal issue",
454: "reasonable compromise","next phase",
455: "goal","time constraint","constraint",
456: "outcome","important outcome",
457: "considerable experience","intelligent choice",
458: "deliverable documentation","discussion",
459: "timely delivery","design issue","large quantity",
460: "general environment","protocol",
461: "transitioning","modeling",
462: "considerable difficulty","abstract interfacing",
463: "data structure","consideration","difficulty",
464: "statistical accuracy",
465: "agenda","technique","reordering",
466: "reauthorization","current proposal",
467: "significant change","criteria","validation",
468: "validity",
469: "terminology","current understanding",
470: "incorporation","staffing impact",
471: "schedule impact","cost tradeoff",
472: "system architecture",
473: "adequate capacity","centralization",
474: "current task","system deployment",
475: "attendant uncertainty","process",
476: "potential usefulness","proposed method",
477: "basic assumption","anomaly",
478: "available data","potential improvement",
479: "registration","exemption","exception",
480: "follow-up","service",
481: "installation","construction","necessity",
482: "occasion","instrumentation","disposal",
483: "attractiveness",
484: "convenience","sponsoring",
485: "signification","meaningfulness",
486: "significantness","individuality",
487: "specification","determination","affirmation",
488: "recruitment","supervision","management",
489: "oversight","overview","environment",
490: "effectation","circumvention","location",
491: "execution","effectiveness","consciousness",
492: "notation","confirmation","restriction",
493: "organization","realization","actification",
494: "activation","reification","beginning","conclusion",
495: "ending","finishing","teamwork","motivation",
496: "attitude","good attitude",
497: "progress","milestone","deadline","schedule",
498: "allocation","resource","command","concern",
499: "time","time frame","reality",
500: "behaviour","ability","advent","increment",
501: "opportunity","accomplishment","aggregate",
502: "analysis","totality","matter",
503: "date","duration","centrality",
504: "proximity","collection","elimintaion",
505: "investigation","opinion","debate",
506: "decision","benefit","difference","discontinuity",
507: "fabrication","plan","chart","forecast",
508: "simplicity","simplification","maximization",
509: "minimization","direction",
510: "agreement",
511: "amount","quantity","quality","essence",
512: "description","violation","purpose",
513: "primary purpose","automatic control","redefinition",
514: "uniform emphasis","study activity","work activity",
515: "concept stage","concept activity",
516: "possible potential","summarization","system function",
517: "rationale","significant enhancement","diverse need",
518: "diverse organization","comprehensive plan","interim",
519: "functional overview","system configuration",
520: "configuration","failure","quantitative result",
521: "major obstacle","conception",
522: "effectiveness","final evaluation",
523: "interrelationship","functional requirement",
524: "system philosophy","verbal interchange",
525: "perceived inadequacy","primary emphasis",
526: "intermingling","cooperation","partnership",
527: "adjustment","application","implementation",
528: "contact","mention","power",
529: "nature","invention","importance",
530: "ground","reason","permission","size",
531: "report","documentation","priority",
532: "pursuance","recurrance","resumption",
533: "presupposition","continuance",
534: "substantiation","success","action","truth",
535: "past experience","greater acceptability",
536: "organizational structure","clear distinction",
537: "clear definition",
538: "significant use","unmet need","centralized organization",
539: "vague concept","negative impact","detrimental effect",
540: "modularization","submodularization",
541: "effect","consistancy",
542: "inconsistancy","completion","utilization",
543: "reference","doubt","evidence",
544: "viewpoint",
545: "actual fact",
546: "true fact","underlying purpose","viable alternative"};
547: X nounv=getxx();
548: int i=0;
549: nounv->type="-noun";
550: if(env->number==0)env->number=number();
551: if(prob(makeup)) {
552: if(prob(0.05)) {
553: nounv->list.s[i++]=CHOOSE(adjlist);
554: nounv->list.s[i++]="ness";
555: }
556: else nounv->list.s[i++]=CHOOSE(wordy);
557: }
558: else {
559: nounv->list.s[i++]=prefix(env);
560: nounv->list.s[i++]=root(env);
561: nounv->list.s[i++]=CHOOSE(suff);
562: }
563: if(EQ(env->number,"plural")) {
564: if(LAST(nounv->list.s[i-1])=='s')nounv->list.s[i]="es";
565: else if(LAST(nounv->list.s[i-1])=='y')nounv->list.s[i]="ies";
566: else nounv->list.s[i]="s";
567: }
568: return nounv;
569: }
570:
571: X nounal(env) E env; {
572: X nounalv=getxx();
573: int i=0;
574: X p;
575: nounalv->type="nounal";
576: if(prob(0.15)) {
577: nounalv->list.x[i++]=adjval(env);
578: }
579: nounalv->list.x[i++]=noun(env);
580: if(prob(0.15)) {
581: nounalv->list.x[i++]=adjph(env);
582: }
583: env->an="a";
584: for(p=nounalv; p->type[0]!='-'; p=p->list.x[0]);
585: for(i=0; p->list.s[i]; i++) {
586: if(p->list.s[i][0]==0)continue;
587: if(VOWEL(p->list.s[i][0])) {
588: env->an="an";
589: }
590: break;
591: }
592: return nounalv;
593: }
594:
595: X adjval(env) E env; {
596: X adjvalv=getxx();
597: int i=0;
598: adjvalv->type="adjval";
599: if(prob(0.25)) {
600: adjvalv->list.x[i++]=adverb(env);
601: }
602: do {
603: adjvalv->list.x[i++]=adjective(env);
604: } while(i<N-1&&prob(0.25));
605: return adjvalv;
606: }
607:
608: char *prefix(env) E env; {
609: static char *pref[] = {
610: "amb","ambi","super","hyper","an","tra","trans","post","palim",
611: "omni","pan","circ","circum","peri","a","ab","abs","de","apo",
612: "re","ana","mal","ante","pre","fore","pro","infra","para",
613: "inter","ultra","extra","trans","cata","de","oct","octa",
614: "octo","equi","pseudo","prim","prot","proto","pent","penta",
615: "quin","quint","quinque","pro","tetr","tetra","quad","quadr",
616: "quadri","quartet","off","bene","hemi","demi","semi","crypto",
617: "cent","centi","hecto","en","em","in","im","intro","be",
618: "macro","poly","mult","multi","neo","nona","novem","ennea",
619: "in","un","im","il","ir","non","a","nil","paleo","mon","mono",
620: "uni","e","ex","ec","ef","super","supr","sur","hyper","vic",
621: "vice","hept","hepta","sept","septe","septem","septi","hex",
622: "hexa","sex","dis","deca","deka","deci","kilo","mill","milli",
623: "tri","per","dia","ad","com","di","amphi","bi","bin","bis",
624: "sub","hypo","epi","eu","holo"};
625: if(prob(0.65))return "";
626: return CHOOSE(pref);
627: }
628:
629: char *root(env) E env; {
630: static char *root[] = {
631: "pan","omni","arch","zo","rog","rogat","cred","flect","flex",
632: "test","hem","hemato","nasc","nat","bibl","fer","voc","port","lat",
633: "fortuna","ped","chrom","vinc","vict","crea","cise","mort","mors",
634: "necr","claim","clam","hetero","pel","puls","vac","iso","phobe",
635: "phobia","prim","prime","flu","flux","sequ","liber","liver","theo",
636: "magna","medi","man","manu","pen","pend","pens","eu","capit",
637: "iatr","aud","aus","cor","cord","cour","grav","ten","tain",
638: "tent","sacr","sacer","heiro","sanct","cide","mega","ultima",
639: "ridi","risi","leg","jus","jur","nom","duc","duct","duce",
640: "bio","viv","vivi","vita","lus","lum","luc","photo",
641: "min","philo","phile","phila","amic","anthrop","poly","multi",
642: "fac","fact","fic","fect","meter","psych","mod","mot","mov",
643: "nov","neo","neg","uni","alter","ali","idio","pop","dem",
644: "demo","lic","licit","poten","posse","potes","mem","simul",
645: "arch","homo","mar","mer","vis","vid","scope","auto","mitt",
646: "miss","ac","acr","brev","clud","clus","dorm","micro","aster",
647: "astro","rect","recti","forc","fort","path","cap","cep","cept",
648: "put","tempo","tempor","dent","dont","ver","veri",
649: "feder","fide","feal","fid","cosm","migra","hydro","aqu",
650: "endo","gyn","logo","opus","oper","graph","scrib","scrip",
651: "mis","miso","anni","annu","enni","ced","cede","ceed","cess"};
652: return CHOOSE(root);
653: }
654:
655: prob(f) double f; {return R<f*32767.0;}
656:
657: char *tense() {return prob(0.5)? "pres": "past";}
658:
659: char *number() {return prob(0.25)?"plural":"sing";}
660:
661: X getxx() {
662: X rv;
663: static XX empty;
664: rv=(X)malloc(sizeof*rv);
665: if(rv==0)printf("outa space\n"),exit(1);
666: *rv=empty;
667: return rv;
668: }
669:
670: X verbal(env) E env; {
671: X verbalv=getxx();
672: int i=0;
673: verbalv->type="verbal";
674: if(prob(0.25))verbalv->list.x[i++]=adverb(env);
675: verbalv->list.x[i++]=verb(env);
676: return verbalv;
677: }
678:
679: X adverb(env) E env; {
680: static char *wordy[] = {"very ","extremely ","generally ","reasonably ",
681: "fundamentally ","essentially ","particularly ","very ",
682: "very ","very ",
683: "very ","very ",
684: "very ","very ",
685: "very ","very ",
686: "very ","very ",
687: "very ","very ",
688: "very ","very ",
689: "entirely ",
690: "rather ","fairly ","relatively ","comparatively ",
691: "moderately ",
692: "totally ","very ","quite "};
693: static char *suff[] = {"wardly","ably","wisely","ably","ily","ly","ly","ly"};
694: static char *c[] = {"absolutely","functionally",
695: "accordingly","broadly","actionably","actually",
696: "additionally",
697: "ambiguously","amply",
698: "analogously",
699: "aperiodically",
700: "apparently","appreciably",
701: "appropriately","approximately",
702: "arbitrarily",
703: "associatively",
704: "automatically",
705: "awfully",
706: "axiomatically",
707: "badly","barely","basically",
708: "beneficially",
709: "blatantly",
710: "capably","carefully","carelessly",
711: "casually","causally","cautiously",
712: "centrally","certainly",
713: "cheaply","cleanly",
714: "closely","coarsely","cognizantly",
715: "coincidentally","collectively","collaterally",
716: "comparably",
717: "competently","completely","comprehensibly",
718: "concededly","conceivably",
719: "concisely","conclusively","concretely",
720: "concurrently","conjecturally",
721: "currently",
722: "conscientously","consequently","consequentially",
723: "consistently","constantly",
724: "contemporaneuosly","constructively",
725: "continually","continuously","contractually",
726: "contrarily","contributatively","conveniently",
727: "conventionally",
728: "correctively",
729: "correctly",
730: "crudely",
731: "curiously",
732: "decidedly",
733: "deeply",
734: "deficiently","demandingly",
735: "dependably","desireably",
736: "determinately","diagnostically",
737: "differentially","differently",
738: "directly","discernibly",
739: "distinctly","doubtfully","dramatically",
740: "dynamically",
741: "economically",
742: "effecaciously","efficiently",
743: "elegantly",
744: "emphatically","encouragingly",
745: "endlessly","endurably",
746: "entirely","epistomologically",
747: "functionally","immediately",
748: "equably","equally","equitably","erroneously",
749: "esoterically","eternally","evenly","eventfully",
750: "eventually","evidently",
751: "exceedingly","exactly","excellently",
752: "exceptionally","excessively","exclusively",
753: "experimentally",
754: "explicitly","extremely",
755: "factually","faithfully",
756: "faultlessly","feasibly",
757: "finitely","firmly","forcefully",
758: "formally","formerly","frankly","freely",
759: "frugally","fully","generally",
760: "globally","gradually",
761: "harmlessly",
762: "helpfully",
763: "highly","homogeneously",
764: "hopefully",
765: "ideally","identically","ideologically",
766: "idiomatically","idiosyncratically","idly",
767: "imaginably","immaterially","immensely",
768: "impartially","imperceptably","imperfectly","importantly",
769: "improperly","imprudently","inaccurately","inappropriately",
770: "accurately",
771: "inclusively","incompletely","incorrectly",
772: "increasingly","independently",
773: "indirectly","ineffectively","ineffectually","inefficiently",
774: "infallibly","instantaneously","instantly",
775: "insufficiently","internally","likely","only",
776: "invaluably","inversely","irrelevantly","irrespectively",
777: "largely","lastly","legitimately","literally",
778: "locally","loosely","manageably","markedly",
779: "memorably","mildly","mindfully","moderately",
780: "momentarily","naturally","needfully","needlessly",
781: "nominally","normally","objectively","occasionally",
782: "temporarily",
783: "officially","oppositely","ordinarily","ostensibly",
784: "partially","permissibly",
785: "personally","pertinently",
786: "physically","plainly","plainly",
787: "pleasingly","politically",
788: "potentially","predictively",
789: "predominantly","prematurely","preparedly","presently",
790: "previously","primarily",
791: "primely","principally","problematically",
792: "productively","promptly","proportionately",
793: "provably","purely","quickly","radically","randomly","recently",
794: "repeatedly","secondarily","separately",
795: "usually","specifically",
796: "redundantly","regardlessly","reliably",
797: "remarkably","remotely","respectively",
798: "probably",
799: "robustly","seemingly",
800: "sensibly","singularly","steadily",
801: "strikingly","substantially","successfully",
802: "supposedly","systematically","understandably",
803: "necessarily","unfortunately",
804: "unnecessarily","unmistakably","usefully","weakly"};
805: X adverbv=getxx();
806: int i=0;
807: adverbv->type="-adverb";
808: if(prob(0.150)) {
809: adverbv->list.s[i++]=prob(.5)?"simply":"easily";
810: return adverbv;
811: }
812: if(prob(0.4))adverbv->list.s[i++]=CHOOSE(wordy);
813: if(prob(makeup))adverbv->list.s[i++]=CHOOSE(c);
814: else {
815: adverbv->list.s[i++]=prefix(env);
816: adverbv->list.s[i++]=root(env);
817: adverbv->list.s[i++]=CHOOSE(suff);
818: }
819: return adverbv;
820: }
821:
822: X adjective(env) E env; {
823: static char *suff[] = {"ive","ful","ous","some","oid","ine","esque","en","an",
824: "ile","able","ible","istic","ic",
825: "an","ian","ish","ite","al","less"};
826: X adjv=getxx();
827: int i=0;
828: adjv->type="-adjective";
829: if(prob(0.2)) {
830: adjv->list.s[i++]="not ";
831: adjv->list.s[i++]="un";
832: }
833: if(prob(makeup)) {
834: adjv->list.s[i++]=CHOOSE(adjlist);
835: return adjv;
836: }
837: adjv->list.s[i++]=prefix(env);
838: adjv->list.s[i++]=root(env);
839: adjv->list.s[i++]=CHOOSE(suff);
840: return adjv;
841: }
842:
843: X adjph(env) E env; {
844: X adjv=getxx();
845: EE nenv;
846: static EE empty;
847: int i=0;
848: adjv->type="adjph";
849: if(prob(0.25)) {
850: nenv= *env;
851: nenv.tense=0;
852: adjv->list.x[i++]=rel(&nenv);
853: adjv->list.x[i++]=aux(&nenv);
854: adjv->list.x[i++]=vp(&nenv);
855: return adjv;
856: }
857: nenv=empty;
858: adjv->list.x[i++]=prep(&nenv);
859: adjv->list.x[i++]=np(&nenv);
860: return adjv;
861: }
862:
863: X prep(env) E env; {
864: static char *prep[] = {"across","by","in","of","near","under","over",
865: "in back of","below","behind","of","of","of","of",
866: "centered around","centered about",
867: "in close proximity to","following after",
868: "in between","in conflict with","in conjunction with",
869: "in the area of","in the neighborhood of","in the proximity of",
870: "in the field of","for the purpose of",
871: "giving rise to","based upon","being caused by",
872: "of","of","of","of",
873: "being effectuated by","being aggrevated by",
874: "being used with",
875: "being collected together with","being combined together with",
876: "connected up to","exhibiting a tendency towards",
877: "being facilitated by",
878: "being employed with",
879: "having a deleterious effect upon","impacting",
880: "being joined together with","being merged together with",
881: "in the vicinity of"};
882: X pv=getxx();
883: pv->type="-prep";
884: pv->list.s[0]=CHOOSE(prep);
885: return pv;
886: }
887:
888: X comp(env) E env; {
889: X v=getxx();
890: EE nenv;
891: static EE empty;
892: int i=0;
893: nenv=empty;
894: v->type="comp";
895: if(0&&prob(0.001))v->list.x[i++]=adjective(&nenv);
896: else if(prob(0.1))v->list.x[i++]=advp(&nenv);
897: else {
898: if(env->passive)v->list.x[i++]=passprep(env);
899: v->list.x[i++]=np(&nenv);
900: env->passive=0;
901: }
902: if(0&&prob(0.05))v->list.x[i++]=adverb(&nenv);
903: return v;
904: }
905:
906: X advp(env) E env; {
907: X v=getxx();
908: v->type="advp";
909: v->list.x[0]=vprep(env);
910: v->list.x[1]=np(env);
911: return v;
912: }
913:
914: X vprep(env) E env; {
915: static char *prep[] = {"to","at","by","from","with","for"};
916: X v=getxx();
917: v->type="-vprep";
918: v->list.s[0]=CHOOSE(prep);
919: return v;
920: }
921:
922: E getenvq() {
923: static EE empty;
924: E v;
925: v=(E) malloc(sizeof*v);
926: if(v==0)printf("outa room\n"),exit(1);
927: *v=empty;
928: return v;
929: }
930:
931: X comma(env) E env; {
932: X v=getxx();
933: static EE empty;
934: v->type="-comma";
935: v->list.s[0]=",";
936: *env=empty;
937: return v;
938: }
939:
940: X conjadv(env) E env; {
941: static char *c[] = {"therefore","however","moreover","obviously"};
942: X v=getxx();
943: v->type="-conjadv";
944: v->list.s[0]=CHOOSE(c);
945: return v;
946: }
947:
948: X lconjadv(env) E env; {
949: static char *c[] = {"therefore","however","nevertheless",
950: "consequently","also","in addition","moreover",
951: "accordingly","essentially","presumably","actually",
952: "basically","importantly","clearly","obviously",
953: "needless to say","as already stated",
954: "generally","approximately","presently",
955: "hopefully","usually","in the great majority of cases",
956: "seen in the above light","most significantly",
957: "when the need arises",
958: "in a large number of cases","after this is accomplished",
959: "in all cases",
960: "having been made aware concerning these matters",
961: "as an example of this","as a consequence of this",
962: "as a matter of fact","as is often the case",
963: "as of this date","assuming that this is the case",
964: "at the present moment in time","at this time",
965: "as a consequent result of this","as a desireable benefit of this",
966: "if at all possible","similarly","in the same connection",
967: "in large measure","in many cases","in rare cases",
968: "in some cases","in the interim","in the last analysis",
969: "in light of these facts","in the majority of instances",
970: "in the not too distant future","in the same way as described above",
971: "in this case","for all intents and purposes",
972: "to arrive at an approximation","for this reason",
973: "for many reasons, then",
974: "as is often the case","last but not least",
975: "later on","on a few occasions","on this occasion",
976: "in summary","taking this into consideration",
977: "with this in mind",
978: "substantially","ultimately"};
979: X v=getxx();
980: v->type="-lconjadv";
981: v->list.s[0]=CHOOSE(c);
982: return v;
983: }
984:
985: X conjsub(env) E env; {
986: static char *c[] = {"although","even though","despite the fact that",
987: "for the simple reason that",
988: "because","due to the fact that","since",
989: "whether or not",
990: "inasmuch as",
991: "as"};
992: X v=getxx();
993: v->type="-conjsub";
994: v->list.s[0]=CHOOSE(c);
995: return v;
996: }
997:
998: X lconjsub(env) E env; {
999: static char *c[] = {"although","even though","despite the fact that",
1000: "because","due to the fact that","since",
1001: "if","anytime that","in the case that",
1002: "as a consequence of the fact that",
1003: "as regards the fact that",
1004: "as a desireable benefit of the fact that",
1005: "with reference to the fact that",
1006: "as long as",
1007: "as an important essential of the fact that",
1008: "in conjunction with the fact that",
1009: "in the light of the fact that",
1010: "if","if","if","if",
1011: "leaving out of consideration the fact that",
1012: "just as",
1013: "inasmuch as","until such time as",
1014: "as soon as","being as","in the same way as",
1015: "with the exception of the fact that",
1016: "notwithstanding the fact that",
1017: "on the grounds that",
1018: "on the basis of the fact that",
1019: "persuant to the fact that",
1020: "although it seems apparent that",
1021: "with regard to the fact that",
1022: "as can be seen from the fact that",
1023: "as"};
1024: X v=getxx();
1025: v->type="-lconjsub";
1026: v->list.s[0]=CHOOSE(c);
1027: return v;
1028: }
1029:
1030: X conj(env) E env; {
1031: static char *c[] = {"and","but","yet","and","and"};
1032: X v=getxx();
1033: v->type="-conj";
1034: v->list.s[0]=CHOOSE(c);
1035: return v;
1036: }
1037:
1038: X nomz(env) E env; {
1039: static char *c[] = {"it is easy to see that","it is a basic fact that",
1040: "it is obvious that","it is not unimportant that",
1041: "it is easy to overlook the fact that",
1042: "it is within the realm of possibility that",
1043: "it is apparent that",
1044: "this is indicitive of the fact that",
1045: "this is in substantial agreement with the fact that",
1046: "this demonstrates the fact that",
1047: "this leaves out of consideration the fact that",
1048: "it is of the utmost importance that",
1049: "the truth is that",
1050: "the fact is that",
1051: "it turns out that","it will turn out to be true that",
1052: "it should be noted that",
1053: "it stands to reason that",
1054: "it would not be unreasonable to assume that",
1055: "it is interesting to note that"};
1056: X v=getxx();
1057: v->type="-nomz";
1058: v->list.s[0]=CHOOSE(c);
1059: return v;
1060: }
1061:
1062: X turgid(env) E env; {
1063: X v=getxx();
1064: int i=0;
1065: v->type="turgid";
1066: if(prob(T*1.5)) {
1067: v->list.x[i++]=lconjadv(env);
1068: v->list.x[i++]=comma(env);
1069: v->list.x[i++]=sent(env);
1070: }
1071: else if(prob(2*T)) {
1072: v->list.x[i++]=turgid(env);
1073: v->list.x[i++]=comma(env);
1074: v->list.x[i++]=conj(env);
1075: v->list.x[i++]=sent(env);
1076: }
1077: else if(prob(1.5*T)) {
1078: v->list.x[i++]=lconjsub(env);
1079: v->list.x[i++]=sent(env);
1080: v->list.x[i++]=comma(env);
1081: v->list.x[i++]=sent(env);
1082: }
1083: else if(prob(T*.5)) {
1084: v->list.x[i++]=sent(env);
1085: v->list.x[i++]=comma(env);
1086: v->list.x[i++]=conjadv(env);
1087: }
1088: else if (prob(T)) {
1089: v->list.x[i++]=turgid(env);
1090: v->list.x[i++]=comma(env);
1091: v->list.x[i++]=conjsub(env);
1092: v->list.x[i++]=sent(env);
1093: }
1094: else if(prob(.5*T)) {
1095: v->list.x[i++]=nomz(env);
1096: v->list.x[i++]=sent(env);
1097: }
1098: else v->list.x[i++]=sent(env);
1099: return v;
1100: }
1101:
1102: /**********************************************************/
1103: char buff[1000];
1104: int io;
1105: int flag;
1106: main(ac,av) char *av[]; {
1107: static char *furniture[] = {"WASTEBASKET","ASHTRAY","TABLE",
1108: "DESK DRAWER","COAT LOCKER","BOOKSHELF"};
1109: static char *ccto[] = {
1110: "J. J. Argosy",
1111: "M. D. Banal",
1112: "H. V. Bandersnatch",
1113: "F. W. Blivet",
1114: "Z. Brazen",
1115: "M. Bushido",
1116: "J. D. Carbuncle",
1117: "N. Crab",
1118: "R. H. deTruckle",
1119: "C. B. Dudgeon",
1120: "R. T. Dun",
1121: "W. G. Fallow",
1122: "R. S. Flummox",
1123: "R. N. Fribble",
1124: "C. R. Glitch",
1125: "S. A. Hobble",
1126: "R. S. Limn",
1127: "S. T. Livid",
1128: "Mrs. B. R. Mauve",
1129: "C. H. Russet",
1130: "M. H. Simper",
1131: "B. R. Sorrel",
1132: "G. Swale",
1133: "R. R. Swarthy",
1134: "P. Terra-Cotta",
1135: "U. G. Winnow"};
1136: E env;
1137: X tree;
1138: int i=0;
1139: int j=0;
1140: int k=0;
1141: int lim=25;
1142: long t;
1143: time(&t);
1144: if(ac<2)abo();
1145: if(ac>2) {
1146: for(makeup=0; *av[2]; av[2]++) {
1147: if(*av[2]<'0'||*av[2]>'9')abo();
1148: makeup=makeup*10+*av[2]-'0';
1149: }
1150: makeup/=100;
1151: if(makeup<0||makeup>1)abo();
1152: makeup=1-makeup;
1153: }
1154: if(ac>1)for(lim=0; *av[1]; av[1]++) {
1155: if(*av[1]<'0'||*av[1]>'9')abo();
1156: lim=lim*10+*av[1]-'0';
1157: }
1158: srand((int)t);
1159: printf(".TL\n");
1160: env=getenvq();
1161: tree=np(env);
1162: io=0;
1163: pr(tree);
1164: buff[io]=0;
1165: caps();
1166: printf("%s\n",buff);
1167: printf(".AU \"C. C. Festoon\"\n");
1168: printf(".AS\n");
1169: free(env);
1170: do {
1171: env=getenvq();
1172: tree=turgid(env);
1173: io=0;
1174: pr(tree);
1175: buff[io]=0;
1176: printf("%s.\n",buff);
1177: free(env);
1178: } while(prob(0.75));
1179: printf(".AE\n");
1180: printf(".MT \"MEMORANDUM FOR %s\"\n",
1181: CHOOSE(furniture));
1182: while(1) {
1183: if(i>=lim) {
1184: printf(".SG\n");
1185: printf(".NS 0\n");
1186: for(j=0; j==0;) {
1187: for(i=0; i<sizeof ccto/sizeof *ccto; i++) {
1188: if(prob(.10))j=1,printf("%s\n",ccto[i]);
1189: }
1190: }
1191: printf(".NE\n");
1192: exit(0);
1193: }
1194: if(i++%23==0) {
1195: env=getenvq();
1196: tree=np(env);
1197: io=0;
1198: printf(".H 1 \"");
1199: pr(tree);
1200: buff[io]=0;
1201: caps();
1202: printf("%s\"\n",buff);
1203: free(env);
1204: }
1205: env=getenvq();
1206: tree=turgid(env);
1207: io=0;
1208: pr(tree);
1209: buff[io]=0;
1210: if(++k%13==0&&prob(0.35)) {
1211: printf("%s:\n",buff);
1212: printf(".BL\n");
1213: do {
1214: printf(".LI\n");
1215: free(env);
1216: env=getenvq();
1217: io=0;
1218: tree=sent(env);
1219: pr(tree);
1220: buff[io]=0;
1221: printf("%s.\n",buff);
1222: } while(prob(.83));
1223: printf(".LE\n");
1224: printf(".P\n");
1225: }
1226: else printf("%s.\n",buff);
1227: if(++j>2&&prob(0.4))printf(".P\n"),j=0;
1228: free(env);
1229: }
1230: }
1231:
1232: pr(tree) X tree; {
1233: int i;
1234: if(flag=='p') {
1235: out("<");
1236: out(tree->type);
1237: out(">");
1238: }
1239: if(tree->type[0]=='-') {
1240: out(" ");
1241: for(i=0; tree->list.s[i]; i++) {
1242: out(tree->list.s[i]);
1243: }
1244: }
1245: else for(i=0; tree->list.x[i]; i++) {
1246: pr(tree->list.x[i]);
1247: }
1248: free(tree);
1249: return;
1250: }
1251:
1252: out(s)char *s;
1253: {
1254: if(io==0&&*s==' ')return;
1255: if(io==0) {
1256: for(;s[io]; io++)buff[io]=s[io];
1257: buff[0]+='A'-'a';
1258: return;
1259: }
1260: if(buff[io-1]==' '&&*s==' ')return;
1261: if(buff[io-1]==' '&&*s==',')io--;
1262: if(buff[io-1]=='y'&&*s=='i'&&s[1]=='e')io--;
1263: else if(*s==buff[io-1]&&*s!='s'&&*s!='n')io--;
1264: else if(*s=='e'&&buff[io-1]=='a')io--;
1265: for(; *s; )buff[io++]= *s++;
1266: return;
1267: }
1268:
1269: caps()
1270: {int i; for(i=1; i<io; i++)
1271: if(buff[i-1]==' '&&buff[i]<='z'&&buff[i]>='a')buff[i]+='A'-'a';
1272: }
1273: abo(){printf("usage: festoon NUMBER-OF-SENTENCES [percent-invented-nouns]\n");
1274: exit(1);
1275: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.