13e5d0078SDavid du Colombier #include <u.h>
23e5d0078SDavid du Colombier #include <libc.h>
33e5d0078SDavid du Colombier
43e5d0078SDavid du Colombier #define R rand()&32767
53e5d0078SDavid du Colombier #define T 0.125
63e5d0078SDavid du Colombier #define CHOOSE(x) (x[(R)%(sizeof x / sizeof x[0])])
73e5d0078SDavid du Colombier #define EQ(a,b) (strcmp(a,b)==0)
83e5d0078SDavid du Colombier #define LAST(x) (x[strlen(x)-1])
93e5d0078SDavid du Colombier #define VOWEL(x) (x=='a'||x=='e'||x=='i'||x=='o'||x=='u')
103e5d0078SDavid du Colombier #define N 8
113e5d0078SDavid du Colombier
123e5d0078SDavid du Colombier typedef struct xyz {
133e5d0078SDavid du Colombier char *type;
143e5d0078SDavid du Colombier union {
153e5d0078SDavid du Colombier struct xyz *x[N];
163e5d0078SDavid du Colombier char *s[N];
173e5d0078SDavid du Colombier } list;
183e5d0078SDavid du Colombier } *X, XX;
193e5d0078SDavid du Colombier typedef struct {
203e5d0078SDavid du Colombier char *number, *ending, *tense, *an, *unspec, *passive;
213e5d0078SDavid du Colombier } *E, EE;
223e5d0078SDavid du Colombier
233e5d0078SDavid du Colombier char *tense(), *number();
243e5d0078SDavid du Colombier char buff[1000];
253e5d0078SDavid du Colombier int io;
263e5d0078SDavid du Colombier int flag;
273e5d0078SDavid du Colombier int eqn=0, tbl=0, pic=0;
283e5d0078SDavid du Colombier double makeup = -1.;
293e5d0078SDavid du Colombier
303e5d0078SDavid du Colombier X np(E);
313e5d0078SDavid du Colombier X aux(E);
323e5d0078SDavid du Colombier X passive(E);
333e5d0078SDavid du Colombier X passprep(void);
343e5d0078SDavid du Colombier X vp(E);
353e5d0078SDavid du Colombier X art(E);
363e5d0078SDavid du Colombier X modal(E);
373e5d0078SDavid du Colombier X perf(E);
383e5d0078SDavid du Colombier X prog(E);
393e5d0078SDavid du Colombier X verb(E);
403e5d0078SDavid du Colombier X noun(E);
413e5d0078SDavid du Colombier X nounal(E);
423e5d0078SDavid du Colombier char *prefix(void);
433e5d0078SDavid du Colombier char *root(void);
443e5d0078SDavid du Colombier int prob(double);
453e5d0078SDavid du Colombier char *tense(void);
463e5d0078SDavid du Colombier char *number(void);
473e5d0078SDavid du Colombier X getxx(void);
483e5d0078SDavid du Colombier X verbal(E);
493e5d0078SDavid du Colombier X adverb(void);
503e5d0078SDavid du Colombier X adjective(void);
513e5d0078SDavid du Colombier X adjph(E);
523e5d0078SDavid du Colombier X prep(void);
533e5d0078SDavid du Colombier X comp(E);
543e5d0078SDavid du Colombier X advp(E);
553e5d0078SDavid du Colombier X vprep(void);
563e5d0078SDavid du Colombier E getenvq(void);
573e5d0078SDavid du Colombier X comma(E);
583e5d0078SDavid du Colombier X conjadv(void);
593e5d0078SDavid du Colombier X lconjadv(void);
603e5d0078SDavid du Colombier X conjsub(void);
613e5d0078SDavid du Colombier X lconjsub(void);
623e5d0078SDavid du Colombier X conj(void);
633e5d0078SDavid du Colombier X nomz(void);
643e5d0078SDavid du Colombier X equation();
653e5d0078SDavid du Colombier X turgid(E);
663e5d0078SDavid du Colombier void pr(X);
673e5d0078SDavid du Colombier void out(char *);
683e5d0078SDavid du Colombier void caps(void);
693e5d0078SDavid du Colombier void abo(void);
703e5d0078SDavid du Colombier char *splitup(char *);
713e5d0078SDavid du Colombier
723e5d0078SDavid du Colombier X
nomq(E env)733e5d0078SDavid du Colombier nomq(E env) {
743e5d0078SDavid du Colombier X v = getxx();
753e5d0078SDavid du Colombier v->type = "-nomq";
763e5d0078SDavid du Colombier if (EQ(env->number, "sing")) {
773e5d0078SDavid du Colombier if (EQ(tense(), "past"))
783e5d0078SDavid du Colombier v->list.s[0] = "there was";
793e5d0078SDavid du Colombier else
803e5d0078SDavid du Colombier v->list.s[0] = "there is";
813e5d0078SDavid du Colombier } else {
823e5d0078SDavid du Colombier if (EQ(tense(), "past"))
833e5d0078SDavid du Colombier v->list.s[0] = "there were";
843e5d0078SDavid du Colombier else
853e5d0078SDavid du Colombier v->list.s[0] = "there are";
863e5d0078SDavid du Colombier }
873e5d0078SDavid du Colombier if (prob(0.2))
883e5d0078SDavid du Colombier v->list.s[1] = " not";
893e5d0078SDavid du Colombier return v;
903e5d0078SDavid du Colombier }
913e5d0078SDavid du Colombier
923e5d0078SDavid du Colombier X
rel(void)933e5d0078SDavid du Colombier rel(void) {
943e5d0078SDavid du Colombier static char *c[] = {"that", "which"};
953e5d0078SDavid du Colombier X v = getxx();
963e5d0078SDavid du Colombier v->type = "-rel";
973e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(c);
983e5d0078SDavid du Colombier return v;
993e5d0078SDavid du Colombier }
1003e5d0078SDavid du Colombier
1013e5d0078SDavid du Colombier X
sent(E env)1023e5d0078SDavid du Colombier sent(E env) {
1033e5d0078SDavid du Colombier X sentv = getxx();
1043e5d0078SDavid du Colombier sentv->type = "sent";
1053e5d0078SDavid du Colombier if (prob(0.09)) {
1063e5d0078SDavid du Colombier env->unspec = "";
1073e5d0078SDavid du Colombier sentv->list.x[1] = np(env);
1083e5d0078SDavid du Colombier sentv->list.x[3] = aux(env);
1093e5d0078SDavid du Colombier sentv->list.x[4] = vp(env);
1103e5d0078SDavid du Colombier sentv->list.x[0] = nomq(env);
1113e5d0078SDavid du Colombier sentv->list.x[2] = rel();
1123e5d0078SDavid du Colombier return sentv;
1133e5d0078SDavid du Colombier }
1143e5d0078SDavid du Colombier sentv->list.x[0] = np(env);
1153e5d0078SDavid du Colombier sentv->list.x[1] = aux(env);
1163e5d0078SDavid du Colombier sentv->list.x[2] = vp(env);
1173e5d0078SDavid du Colombier return sentv;
1183e5d0078SDavid du Colombier }
1193e5d0078SDavid du Colombier
1203e5d0078SDavid du Colombier X
nomy(void)1213e5d0078SDavid du Colombier nomy(void) {
1223e5d0078SDavid du Colombier X v = getxx();
1233e5d0078SDavid du Colombier v->type = "-nomq";
1243e5d0078SDavid du Colombier v->list.s[0] = "the fact that";
1253e5d0078SDavid du Colombier return v;
1263e5d0078SDavid du Colombier }
1273e5d0078SDavid du Colombier
1283e5d0078SDavid du Colombier X
np(env)1293e5d0078SDavid du Colombier np(env)
1303e5d0078SDavid du Colombier E env;
1313e5d0078SDavid du Colombier {
1323e5d0078SDavid du Colombier X npv = getxx();
1333e5d0078SDavid du Colombier EE nenv;
1343e5d0078SDavid du Colombier static EE empty;
1353e5d0078SDavid du Colombier npv->type = "np";
1363e5d0078SDavid du Colombier if (prob(0.025)) {
1373e5d0078SDavid du Colombier nenv = empty;
1383e5d0078SDavid du Colombier npv->list.x[0] = nomy();
1393e5d0078SDavid du Colombier npv->list.x[1] = sent(&nenv);
1403e5d0078SDavid du Colombier if (env->number == 0)
1413e5d0078SDavid du Colombier env->number = "sing";
1423e5d0078SDavid du Colombier return npv;
1433e5d0078SDavid du Colombier }
1443e5d0078SDavid du Colombier npv->list.x[1] = nounal(env);
1453e5d0078SDavid du Colombier npv->list.x[0] = art(env);
1463e5d0078SDavid du Colombier return npv;
1473e5d0078SDavid du Colombier }
1483e5d0078SDavid du Colombier
1493e5d0078SDavid du Colombier X
aux(E env)1503e5d0078SDavid du Colombier aux(E env) {
1513e5d0078SDavid du Colombier X auxv = getxx();
1523e5d0078SDavid du Colombier int i = 0;
1533e5d0078SDavid du Colombier auxv->type = "aux";
1543e5d0078SDavid du Colombier if (env->tense == 0)
1553e5d0078SDavid du Colombier env->tense = env->ending = tense();
1563e5d0078SDavid du Colombier if (prob(0.25))
1573e5d0078SDavid du Colombier auxv->list.x[i++] = modal(env);
1583e5d0078SDavid du Colombier if (prob(0.25))
1593e5d0078SDavid du Colombier auxv->list.x[i++] = perf(env);
1603e5d0078SDavid du Colombier if (prob(0.25))
1613e5d0078SDavid du Colombier auxv->list.x[i++] = prog(env);
1623e5d0078SDavid du Colombier USED(i);
1633e5d0078SDavid du Colombier return auxv;
1643e5d0078SDavid du Colombier }
1653e5d0078SDavid du Colombier
1663e5d0078SDavid du Colombier X
passive(env)1673e5d0078SDavid du Colombier passive(env)
1683e5d0078SDavid du Colombier E env;
1693e5d0078SDavid du Colombier {
1703e5d0078SDavid du Colombier X v = getxx();
1713e5d0078SDavid du Colombier v->type = "-passive";
1723e5d0078SDavid du Colombier if (env->tense == 0)
1733e5d0078SDavid du Colombier env->tense = env->ending = tense();
1743e5d0078SDavid du Colombier if (env->number == 0)
1753e5d0078SDavid du Colombier env->number = number();
1763e5d0078SDavid du Colombier if (EQ(env->ending, "modal"))
1773e5d0078SDavid du Colombier v->list.s[0] = "be";
1783e5d0078SDavid du Colombier else if (EQ(env->ending, "-en"))
1793e5d0078SDavid du Colombier v->list.s[0] = "been";
1803e5d0078SDavid du Colombier else if (EQ(env->ending, "-ing"))
1813e5d0078SDavid du Colombier v->list.s[0] = "being";
1823e5d0078SDavid du Colombier else {
1833e5d0078SDavid du Colombier if (EQ(env->tense, "past"))
1843e5d0078SDavid du Colombier v->list.s[0] = EQ(env->number, "sing") ? "was" : "were";
1853e5d0078SDavid du Colombier else
1863e5d0078SDavid du Colombier v->list.s[0] = EQ(env->number, "sing") ? "is" : "are";
1873e5d0078SDavid du Colombier }
1883e5d0078SDavid du Colombier env->passive = env->ending = "pass";
1893e5d0078SDavid du Colombier return v;
1903e5d0078SDavid du Colombier }
1913e5d0078SDavid du Colombier
1923e5d0078SDavid du Colombier X
passprep(void)1933e5d0078SDavid du Colombier passprep(void) {
1943e5d0078SDavid du Colombier X v = getxx();
1953e5d0078SDavid du Colombier v->type = "-passprep";
1963e5d0078SDavid du Colombier v->list.s[0] = "by";
1973e5d0078SDavid du Colombier return v;
1983e5d0078SDavid du Colombier }
1993e5d0078SDavid du Colombier
2003e5d0078SDavid du Colombier X
vp(env)2013e5d0078SDavid du Colombier vp(env)
2023e5d0078SDavid du Colombier E env;
2033e5d0078SDavid du Colombier {
2043e5d0078SDavid du Colombier X vpv = getxx();
2053e5d0078SDavid du Colombier int i = 0;
2063e5d0078SDavid du Colombier vpv->type = "vp";
2073e5d0078SDavid du Colombier if (prob(0.5))
2083e5d0078SDavid du Colombier vpv->list.x[i++] = passive(env);
2093e5d0078SDavid du Colombier vpv->list.x[i++] = verbal(env);
2103e5d0078SDavid du Colombier vpv->list.x[i++] = comp(env);
2113e5d0078SDavid du Colombier if (prob(0.10))
2123e5d0078SDavid du Colombier vpv->list.x[i++] = advp(env);
2133e5d0078SDavid du Colombier USED(i);
2143e5d0078SDavid du Colombier return vpv;
2153e5d0078SDavid du Colombier }
2163e5d0078SDavid du Colombier
2173e5d0078SDavid du Colombier X
art(env)2183e5d0078SDavid du Colombier art(env)
2193e5d0078SDavid du Colombier E env;
2203e5d0078SDavid du Colombier {
2213e5d0078SDavid du Colombier static char *aspecsg[] = {"the", "the", "the", "the", "the", "this", "this", "that"};
2223e5d0078SDavid du Colombier static char *aspecpl[] = {"the", "the", "the", "the", "the", "these", "those"};
2233e5d0078SDavid du Colombier static char *aunssg[] = {"a", "a", "a", "a", "a", "a", "a", "much", "each", "any"};
2243e5d0078SDavid du Colombier static char *aunspl[] = {"some", "a few", "a couple", "several", "many", "all",
2253e5d0078SDavid du Colombier "no",
2263e5d0078SDavid du Colombier "an undue number of",
2273e5d0078SDavid du Colombier "a number of"};
2283e5d0078SDavid du Colombier X artv = getxx();
2293e5d0078SDavid du Colombier artv->type = "-art";
2303e5d0078SDavid du Colombier if (env->number == 0)
2313e5d0078SDavid du Colombier env->number = number();
2323e5d0078SDavid du Colombier if (env->unspec == 0 && prob(0.33)) {
2333e5d0078SDavid du Colombier if (EQ(env->number, "sing"))
2343e5d0078SDavid du Colombier artv->list.s[0] = CHOOSE(aspecsg);
2353e5d0078SDavid du Colombier else
2363e5d0078SDavid du Colombier artv->list.s[0] = CHOOSE(aspecpl);
2373e5d0078SDavid du Colombier } else if (prob(0.50) || env->an && EQ(env->number, "sing")) {
2383e5d0078SDavid du Colombier if (EQ(env->number, "sing"))
2393e5d0078SDavid du Colombier artv->list.s[0] = env->an ? "a" : CHOOSE(aunssg);
2403e5d0078SDavid du Colombier else
2413e5d0078SDavid du Colombier artv->list.s[0] = CHOOSE(aunspl);
2423e5d0078SDavid du Colombier if (env->an && EQ(artv->list.s[0], "all"))
2433e5d0078SDavid du Colombier artv->list.s[0] = "";
2443e5d0078SDavid du Colombier } else
2453e5d0078SDavid du Colombier artv->list.s[0] = "";
2463e5d0078SDavid du Colombier env->unspec = 0;
2473e5d0078SDavid du Colombier if (env->an && EQ(env->an, "an") && EQ(artv->list.s[0], "a"))
2483e5d0078SDavid du Colombier artv->list.s[0] = "an";
2493e5d0078SDavid du Colombier env->an = 0;
2503e5d0078SDavid du Colombier return artv;
2513e5d0078SDavid du Colombier }
2523e5d0078SDavid du Colombier
2533e5d0078SDavid du Colombier X
modal(env)2543e5d0078SDavid du Colombier modal(env)
2553e5d0078SDavid du Colombier E env;
2563e5d0078SDavid du Colombier {
2573e5d0078SDavid du Colombier static char *pres[] = {"can", "may", "must", "shall", "will"};
2583e5d0078SDavid du Colombier static char *past[] = {"could", "might", "should", "would"};
2593e5d0078SDavid du Colombier X modalv = getxx();
2603e5d0078SDavid du Colombier modalv->type = "-modal";
2613e5d0078SDavid du Colombier if (env->tense == 0)
2623e5d0078SDavid du Colombier env->tense = env->ending = tense();
2633e5d0078SDavid du Colombier if (EQ(env->ending, "pres"))
2643e5d0078SDavid du Colombier modalv->list.s[0] = CHOOSE(pres);
2653e5d0078SDavid du Colombier else
2663e5d0078SDavid du Colombier modalv->list.s[0] = CHOOSE(past);
2673e5d0078SDavid du Colombier env->ending = "modal";
2683e5d0078SDavid du Colombier return modalv;
2693e5d0078SDavid du Colombier }
2703e5d0078SDavid du Colombier
2713e5d0078SDavid du Colombier X
perf(env)2723e5d0078SDavid du Colombier perf(env)
2733e5d0078SDavid du Colombier E env;
2743e5d0078SDavid du Colombier {
2753e5d0078SDavid du Colombier X perfv = getxx();
2763e5d0078SDavid du Colombier perfv->type = "-perf";
2773e5d0078SDavid du Colombier if (env->tense == 0)
2783e5d0078SDavid du Colombier env->tense = env->ending = tense();
2793e5d0078SDavid du Colombier if (env->number == 0)
2803e5d0078SDavid du Colombier env->number = number();
2813e5d0078SDavid du Colombier if (EQ(env->ending, "past")) {
2823e5d0078SDavid du Colombier perfv->list.s[0] = "had";
2833e5d0078SDavid du Colombier } else if (EQ(env->ending, "pres")) {
2843e5d0078SDavid du Colombier if (EQ(env->number, "sing"))
2853e5d0078SDavid du Colombier perfv->list.s[0] = "had";
2863e5d0078SDavid du Colombier else
2873e5d0078SDavid du Colombier perfv->list.s[0] = "have";
2883e5d0078SDavid du Colombier } else
2893e5d0078SDavid du Colombier perfv->list.s[0] = "have";
2903e5d0078SDavid du Colombier env->ending = "-en";
2913e5d0078SDavid du Colombier return perfv;
2923e5d0078SDavid du Colombier }
2933e5d0078SDavid du Colombier
2943e5d0078SDavid du Colombier X
prog(env)2953e5d0078SDavid du Colombier prog(env)
2963e5d0078SDavid du Colombier E env;
2973e5d0078SDavid du Colombier {
2983e5d0078SDavid du Colombier X progv = getxx();
2993e5d0078SDavid du Colombier progv->type = "-prog";
3003e5d0078SDavid du Colombier if (env->tense == 0)
3013e5d0078SDavid du Colombier env->tense = env->ending = tense();
3023e5d0078SDavid du Colombier if (env->number == 0)
3033e5d0078SDavid du Colombier env->number = number();
3043e5d0078SDavid du Colombier if (EQ(env->ending, "pres")) {
3053e5d0078SDavid du Colombier if (EQ(env->number, "sing"))
3063e5d0078SDavid du Colombier progv->list.s[0] = "is";
3073e5d0078SDavid du Colombier else
3083e5d0078SDavid du Colombier progv->list.s[0] = "are";
3093e5d0078SDavid du Colombier } else if (EQ(env->ending, "past")) {
3103e5d0078SDavid du Colombier if (EQ(env->number, "sing"))
3113e5d0078SDavid du Colombier progv->list.s[0] = "was";
3123e5d0078SDavid du Colombier else
3133e5d0078SDavid du Colombier progv->list.s[0] = "were";
3143e5d0078SDavid du Colombier } else if (EQ(env->ending, "-en")) {
3153e5d0078SDavid du Colombier progv->list.s[0] = "been";
3163e5d0078SDavid du Colombier } else if (EQ(env->ending, "modal")) {
3173e5d0078SDavid du Colombier progv->list.s[0] = "be";
3183e5d0078SDavid du Colombier }
3193e5d0078SDavid du Colombier env->ending = "-ing";
3203e5d0078SDavid du Colombier return progv;
3213e5d0078SDavid du Colombier }
3223e5d0078SDavid du Colombier
3233e5d0078SDavid du Colombier X
verb(env)3243e5d0078SDavid du Colombier verb(env)
3253e5d0078SDavid du Colombier E env;
3263e5d0078SDavid du Colombier {
3273e5d0078SDavid du Colombier /* they pres, he pres, they past, they perf, they prog, they pass */
3283e5d0078SDavid du Colombier static char *ends[][6] = {{"ate", "ates", "ated", "ated", "ating", "ated"},
3293e5d0078SDavid du Colombier {"en", "ens", "ened", "ened", "ening", "ened"},
3303e5d0078SDavid du Colombier {"esce", "esces", "esced", "esced", "escing", "esced"},
3313e5d0078SDavid du Colombier {"fy", "fies", "fied", "fied", "fying", "fied"},
3323e5d0078SDavid du Colombier {"ize", "izes", "ized", "ized", "izing", "ized"}};
3333e5d0078SDavid du Colombier X verbv = getxx();
3343e5d0078SDavid du Colombier int i;
3353e5d0078SDavid du Colombier verbv->type = "-verb";
3363e5d0078SDavid du Colombier if (env->tense == 0)
3373e5d0078SDavid du Colombier env->tense = env->ending = tense();
3383e5d0078SDavid du Colombier if (env->number == 0)
3393e5d0078SDavid du Colombier env->number = number();
3403e5d0078SDavid du Colombier if (0 && prob(0.1) && EQ(env->tense, env->ending)) {
3413e5d0078SDavid du Colombier if (EQ(env->number, "sing")) {
3423e5d0078SDavid du Colombier if (EQ(env->tense, "pres"))
3433e5d0078SDavid du Colombier verbv->list.s[0] = "is";
3443e5d0078SDavid du Colombier else
3453e5d0078SDavid du Colombier verbv->list.s[0] = "was";
3463e5d0078SDavid du Colombier } else {
3473e5d0078SDavid du Colombier if (EQ(env->tense, "pres"))
3483e5d0078SDavid du Colombier verbv->list.s[0] = "are";
3493e5d0078SDavid du Colombier else
3503e5d0078SDavid du Colombier verbv->list.s[0] = "were";
3513e5d0078SDavid du Colombier }
3523e5d0078SDavid du Colombier } else {
3533e5d0078SDavid du Colombier verbv->list.s[0] = prefix();
3543e5d0078SDavid du Colombier verbv->list.s[1] = root();
3553e5d0078SDavid du Colombier if (EQ(env->ending, "pres") && EQ(env->number, "sing"))
3563e5d0078SDavid du Colombier i = 1;
3573e5d0078SDavid du Colombier else if (EQ(env->ending, "pres") || EQ(env->ending, "modal"))
3583e5d0078SDavid du Colombier i = 0;
3593e5d0078SDavid du Colombier else if (EQ(env->ending, "past"))
3603e5d0078SDavid du Colombier i = 2;
3613e5d0078SDavid du Colombier else if (EQ(env->ending, "-en"))
3623e5d0078SDavid du Colombier i = 3;
3633e5d0078SDavid du Colombier else if (EQ(env->ending, "-ing"))
3643e5d0078SDavid du Colombier i = 4;
3653e5d0078SDavid du Colombier else if (EQ(env->ending, "pass"))
3663e5d0078SDavid du Colombier i = 5;
3673e5d0078SDavid du Colombier else
3683e5d0078SDavid du Colombier i = 0;
3693e5d0078SDavid du Colombier verbv->list.s[2] = ends[R % (sizeof ends / sizeof *ends)][i];
3703e5d0078SDavid du Colombier }
3713e5d0078SDavid du Colombier env->ending = 0;
3723e5d0078SDavid du Colombier return verbv;
3733e5d0078SDavid du Colombier }
3743e5d0078SDavid du Colombier
3753e5d0078SDavid du Colombier static char *nounlist[] = {"final completion",
3763e5d0078SDavid du Colombier "final ending", "final outcome",
3773e5d0078SDavid du Colombier "adaptation", "appearance", "argument", "circumstance",
3783e5d0078SDavid du Colombier "confession", "confidence", "delimitation", "dilution",
3793e5d0078SDavid du Colombier "dissertation", "distribution", "duplication",
3803e5d0078SDavid du Colombier "entertainment", "equipment", "evolution",
3813e5d0078SDavid du Colombier "existence", "expression", "generation", "impression",
3823e5d0078SDavid du Colombier "integration", "interaction", "investment", "judgment",
3833e5d0078SDavid du Colombier "population", "provision", "solution", "statement",
3843e5d0078SDavid du Colombier "tradition", "transmission",
3853e5d0078SDavid du Colombier "final result", "added increment", "assistance",
3863e5d0078SDavid du Colombier "beneficial assistance", "mutual cooperation",
3873e5d0078SDavid du Colombier "projection", "future projection",
3883e5d0078SDavid du Colombier "capability", "conjecture", "consensus of opinion",
3893e5d0078SDavid du Colombier "general consensus", "absence", "deficiency",
3903e5d0078SDavid du Colombier "inadequacy", "insufficience", "insufficiency",
3913e5d0078SDavid du Colombier "growing importance", "renewed emphasis",
3923e5d0078SDavid du Colombier "renewed interest", "changing behavior",
3933e5d0078SDavid du Colombier "critical thinking", "careful thinking",
3943e5d0078SDavid du Colombier "comprehensive survey", "high standard",
3953e5d0078SDavid du Colombier "basic foundation", "system testing",
3963e5d0078SDavid du Colombier "serious discussion", "serious concern",
3973e5d0078SDavid du Colombier "organizational framework", "prototype model",
3983e5d0078SDavid du Colombier "uniform nomenclature", "greater cooperation",
3993e5d0078SDavid du Colombier "uniform consistency", "early expectation",
4003e5d0078SDavid du Colombier "standardization", "great similarity",
4013e5d0078SDavid du Colombier "shortage", "presence", "sufficiency",
4023e5d0078SDavid du Colombier "consequent result", "construct", "disutility",
4033e5d0078SDavid du Colombier "early beginning", "emotional feeling", "endeavor",
4043e5d0078SDavid du Colombier "authorization", "order of magnitude", "preference",
4053e5d0078SDavid du Colombier "impact", "joint cooperation", "joint partnership",
4063e5d0078SDavid du Colombier "main essential", "methodology", "modification",
4073e5d0078SDavid du Colombier "necessary requisite", "past history", "situation",
4083e5d0078SDavid du Colombier "effectuation", "clarification", "new doubt",
4093e5d0078SDavid du Colombier "policy", "encouragement", "preparation",
4103e5d0078SDavid du Colombier "criterion", "material", "interest", "acceptance",
4113e5d0078SDavid du Colombier "rejection", "publication", "circulation",
4123e5d0078SDavid du Colombier "protection", "insurance",
4133e5d0078SDavid du Colombier "assignment", "identification",
4143e5d0078SDavid du Colombier "submission", "request",
4153e5d0078SDavid du Colombier "guidance", "correspondence", "inclusion",
4163e5d0078SDavid du Colombier "attachment", "assumption",
4173e5d0078SDavid du Colombier "recommendation", "prescription", "approval",
4183e5d0078SDavid du Colombier "discretion", "responsibility", "relevance",
4193e5d0078SDavid du Colombier "issuance", "termination", "total effect",
4203e5d0078SDavid du Colombier "deleterious effect", "consolidation",
4213e5d0078SDavid du Colombier "aggregation", "definiteness", "commencement",
4223e5d0078SDavid du Colombier "actual experience", "experience",
4233e5d0078SDavid du Colombier "combination", "accord", "filing",
4243e5d0078SDavid du Colombier "idea", "abstraction", "method", "procedure",
4253e5d0078SDavid du Colombier "complaint", "maintenance", "finance", "travel",
4263e5d0078SDavid du Colombier "purchase", "repair", "routine",
4273e5d0078SDavid du Colombier "development", "cancellation",
4283e5d0078SDavid du Colombier "partitioning", "development effort",
4293e5d0078SDavid du Colombier "project", "automation", "multilevel architecture",
4303e5d0078SDavid du Colombier "multilevel heirarchy", "data stream",
4313e5d0078SDavid du Colombier "objective",
4323e5d0078SDavid du Colombier "individual assignment", "mode of operation",
4333e5d0078SDavid du Colombier "clear community", "attendant interest",
4343e5d0078SDavid du Colombier "task division", "well defined interfacing",
4353e5d0078SDavid du Colombier "team report", "meeting time", "effective use",
4363e5d0078SDavid du Colombier "friction",
4373e5d0078SDavid du Colombier "major objective", "ownership",
4383e5d0078SDavid du Colombier "overall project time constraint",
4393e5d0078SDavid du Colombier "functional division", "requirements analysis",
4403e5d0078SDavid du Colombier "code development", "charter",
4413e5d0078SDavid du Colombier "requirements definition", "vertical division",
4423e5d0078SDavid du Colombier "broad range", "strong feeling",
4433e5d0078SDavid du Colombier "considerable latitude", "overall project constraint",
4443e5d0078SDavid du Colombier "sufficient resource", "assigned task", "expectation",
4453e5d0078SDavid du Colombier "critical aspect", "clear understanding",
4463e5d0078SDavid du Colombier "computing load", "clean interfacing", "natural basis",
4473e5d0078SDavid du Colombier "team activity", "team responsibility",
4483e5d0078SDavid du Colombier "main function", "predominant portion",
4493e5d0078SDavid du Colombier "work plan", "major breakpoint", "work module",
4503e5d0078SDavid du Colombier "achievable accuracy", "supplementary work",
4513e5d0078SDavid du Colombier "field version", "internal establishment",
4523e5d0078SDavid du Colombier "internal communication", "development progress",
4533e5d0078SDavid du Colombier "internal meeting", "experience level",
4543e5d0078SDavid du Colombier "high level autonomy", "adherence",
4553e5d0078SDavid du Colombier "feasibility demonstration", "persistent problem",
4563e5d0078SDavid du Colombier "internal objective", "idea sharing",
4573e5d0078SDavid du Colombier "improved performance", "unfamiliar methodology",
4583e5d0078SDavid du Colombier "new methodology", "development experience",
4593e5d0078SDavid du Colombier "module specification", "good progress",
4603e5d0078SDavid du Colombier "optimal number", "natural division",
4613e5d0078SDavid du Colombier "good relationship", "cross attendance",
4623e5d0078SDavid du Colombier "attendance", "necessary communication",
4633e5d0078SDavid du Colombier "evolving organization", "basic principle",
4643e5d0078SDavid du Colombier "complete revision", "general information",
4653e5d0078SDavid du Colombier "primary objective", "load-carrying capacity",
4663e5d0078SDavid du Colombier "necessary revision", "major change",
4673e5d0078SDavid du Colombier "clarified interpretation", "subsequent attempt",
4683e5d0078SDavid du Colombier "basic objective", "full utilization",
4693e5d0078SDavid du Colombier "practical consideration",
4703e5d0078SDavid du Colombier "proportionate quantity", "substantial change",
4713e5d0078SDavid du Colombier "database design", "unified framework",
4723e5d0078SDavid du Colombier "customer service", "strong interest",
4733e5d0078SDavid du Colombier "unified description", "necessary background information",
4743e5d0078SDavid du Colombier "provisioning", "physical coverage", "general observation",
4753e5d0078SDavid du Colombier "new technology", "validity determination",
4763e5d0078SDavid du Colombier "relation", "regulation", "verification",
4773e5d0078SDavid du Colombier "impediment", "portal", "practice", "premise",
4783e5d0078SDavid du Colombier "basis", "movement", "question",
4793e5d0078SDavid du Colombier "issue", "input", "output", "observation",
4803e5d0078SDavid du Colombier "input", "output", "input", "output",
4813e5d0078SDavid du Colombier "mechanization", "function", "evaluation",
4823e5d0078SDavid du Colombier "result", "further consideration", "category",
4833e5d0078SDavid du Colombier "performance indicator", "early warning",
4843e5d0078SDavid du Colombier "analysis purpose", "measurement", "replacement",
4853e5d0078SDavid du Colombier "utilitarian purpose",
4863e5d0078SDavid du Colombier "quota", "proposed enhancement", "enhancement",
4873e5d0078SDavid du Colombier "interfacing", "team organization", "module",
4883e5d0078SDavid du Colombier "guideline", "continuing study",
4893e5d0078SDavid du Colombier "required assistance", "major advance",
4903e5d0078SDavid du Colombier "proposal", "hierarchy",
4913e5d0078SDavid du Colombier "current view", "refinement", "activity",
4923e5d0078SDavid du Colombier "external description", "tight schedule pressure",
4933e5d0078SDavid du Colombier "internal conflict", "internal issue",
4943e5d0078SDavid du Colombier "reasonable compromise", "next phase",
4953e5d0078SDavid du Colombier "goal", "time constraint", "constraint",
4963e5d0078SDavid du Colombier "outcome", "important outcome",
4973e5d0078SDavid du Colombier "considerable experience", "intelligent choice",
4983e5d0078SDavid du Colombier "deliverable documentation", "discussion",
4993e5d0078SDavid du Colombier "timely delivery", "design issue", "large quantity",
5003e5d0078SDavid du Colombier "general environment", "protocol",
5013e5d0078SDavid du Colombier "transitioning", "modeling",
5023e5d0078SDavid du Colombier "considerable difficulty", "abstract interfacing",
5033e5d0078SDavid du Colombier "data structure", "consideration", "difficulty",
5043e5d0078SDavid du Colombier "statistical accuracy",
5053e5d0078SDavid du Colombier "agenda", "technique", "reordering",
5063e5d0078SDavid du Colombier "reauthorization", "current proposal",
5073e5d0078SDavid du Colombier "significant change", "criteria", "validation",
5083e5d0078SDavid du Colombier "validity",
5093e5d0078SDavid du Colombier "terminology", "current understanding",
5103e5d0078SDavid du Colombier "incorporation", "staffing impact",
5113e5d0078SDavid du Colombier "schedule impact", "cost tradeoff",
5123e5d0078SDavid du Colombier "system architecture",
5133e5d0078SDavid du Colombier "adequate capacity", "centralization",
5143e5d0078SDavid du Colombier "current task", "system deployment",
5153e5d0078SDavid du Colombier "attendant uncertainty", "process",
5163e5d0078SDavid du Colombier "potential usefulness", "proposed method",
5173e5d0078SDavid du Colombier "basic assumption", "anomaly",
5183e5d0078SDavid du Colombier "available data", "potential improvement",
5193e5d0078SDavid du Colombier "registration", "exemption", "exception",
5203e5d0078SDavid du Colombier "follow-up", "service",
5213e5d0078SDavid du Colombier "installation", "construction", "necessity",
5223e5d0078SDavid du Colombier "occasion", "instrumentation", "disposal",
5233e5d0078SDavid du Colombier "attractiveness",
5243e5d0078SDavid du Colombier "convenience", "sponsoring",
5253e5d0078SDavid du Colombier "signification", "meaningfulness",
5263e5d0078SDavid du Colombier "significantness", "individuality",
5273e5d0078SDavid du Colombier "specification", "determination", "affirmation",
5283e5d0078SDavid du Colombier "recruitment", "supervision", "management",
5293e5d0078SDavid du Colombier "oversight", "overview", "environment",
5303e5d0078SDavid du Colombier "effectation", "circumvention", "location",
5313e5d0078SDavid du Colombier "execution", "effectiveness", "consciousness",
5323e5d0078SDavid du Colombier "notation", "confirmation", "restriction",
5333e5d0078SDavid du Colombier "organization", "realization", "actification",
5343e5d0078SDavid du Colombier "activation", "reification", "beginning", "conclusion",
5353e5d0078SDavid du Colombier "ending", "finishing", "teamwork", "motivation",
5363e5d0078SDavid du Colombier "attitude", "good attitude",
5373e5d0078SDavid du Colombier "progress", "milestone", "deadline", "schedule",
5383e5d0078SDavid du Colombier "allocation", "resource", "command", "concern",
5393e5d0078SDavid du Colombier "time", "time frame", "reality",
5403e5d0078SDavid du Colombier "behaviour", "ability", "advent", "increment",
5413e5d0078SDavid du Colombier "opportunity", "accomplishment", "aggregate",
5423e5d0078SDavid du Colombier "analysis", "totality", "matter",
5433e5d0078SDavid du Colombier "date", "duration", "centrality",
5443e5d0078SDavid du Colombier "proximity", "collection", "elimination",
5453e5d0078SDavid du Colombier "investigation", "opinion", "debate",
5463e5d0078SDavid du Colombier "decision", "benefit", "difference", "discontinuity",
5473e5d0078SDavid du Colombier "fabrication", "plan", "chart", "forecast",
5483e5d0078SDavid du Colombier "simplicity", "simplification", "maximization",
5493e5d0078SDavid du Colombier "minimization", "direction",
5503e5d0078SDavid du Colombier "agreement",
5513e5d0078SDavid du Colombier "amount", "quantity", "quality", "essence",
5523e5d0078SDavid du Colombier "description", "violation", "purpose",
5533e5d0078SDavid du Colombier "primary purpose", "automatic control", "redefinition",
5543e5d0078SDavid du Colombier "uniform emphasis", "study activity", "work activity",
5553e5d0078SDavid du Colombier "concept stage", "concept activity",
5563e5d0078SDavid du Colombier "possible potential", "summarization", "system function",
5573e5d0078SDavid du Colombier "rationale", "significant enhancement", "diverse need",
5583e5d0078SDavid du Colombier "diverse organization", "comprehensive plan", "interim",
5593e5d0078SDavid du Colombier "functional overview", "system configuration",
5603e5d0078SDavid du Colombier "configuration", "failure", "quantitative result",
5613e5d0078SDavid du Colombier "major obstacle", "conception",
5623e5d0078SDavid du Colombier "effectiveness", "final evaluation",
5633e5d0078SDavid du Colombier "interrelationship", "functional requirement",
5643e5d0078SDavid du Colombier "system philosophy", "verbal interchange",
5653e5d0078SDavid du Colombier "perceived inadequacy", "primary emphasis",
5663e5d0078SDavid du Colombier "intermingling", "cooperation", "partnership",
5673e5d0078SDavid du Colombier "adjustment", "application", "implementation",
5683e5d0078SDavid du Colombier "contact", "mention", "power",
5693e5d0078SDavid du Colombier "nature", "invention", "importance",
5703e5d0078SDavid du Colombier "ground", "reason", "permission", "size",
5713e5d0078SDavid du Colombier "report", "documentation", "priority",
5723e5d0078SDavid du Colombier "pursuance", "recurrance", "resumption",
5733e5d0078SDavid du Colombier "presupposition", "continuance",
5743e5d0078SDavid du Colombier "substantiation", "success", "action", "truth",
5753e5d0078SDavid du Colombier "past experience", "greater acceptability",
5763e5d0078SDavid du Colombier "organizational structure", "clear distinction",
5773e5d0078SDavid du Colombier "clear definition",
5783e5d0078SDavid du Colombier "significant use", "unmet need", "centralized organization",
5793e5d0078SDavid du Colombier "vague concept", "negative impact", "detrimental effect",
5803e5d0078SDavid du Colombier "modularization", "submodularization",
5813e5d0078SDavid du Colombier "effect", "consistancy",
5823e5d0078SDavid du Colombier "inconsistancy", "completion", "utilization",
5833e5d0078SDavid du Colombier "reference", "doubt", "evidence",
5843e5d0078SDavid du Colombier "viewpoint",
5853e5d0078SDavid du Colombier "actual fact",
5863e5d0078SDavid du Colombier "true fact", "underlying purpose", "viable alternative"};
5873e5d0078SDavid du Colombier
5883e5d0078SDavid du Colombier static char *adjlist[] = {"concrete", "abstract", "procedural",
5893e5d0078SDavid du Colombier "real", "ideal", "functional", "prototype",
5903e5d0078SDavid du Colombier "effective", "capable", "incremental",
5913e5d0078SDavid du Colombier "perceived", "associated", "interdepartmental",
5923e5d0078SDavid du Colombier "diverse", "characteristic", "worst-case",
5933e5d0078SDavid du Colombier "qualitative", "fully automatic", "candidate",
5943e5d0078SDavid du Colombier "consensual", "consequential", "conjectural",
5953e5d0078SDavid du Colombier "constructive", "initial", "cooperative",
5963e5d0078SDavid du Colombier "essential", "methodological", "requisite",
5973e5d0078SDavid du Colombier "historical", "situational", "political",
5983e5d0078SDavid du Colombier "prepared", "material", "defined", "well defined",
5993e5d0078SDavid du Colombier "organizational", "projected", "overall",
6003e5d0078SDavid du Colombier "accepted", "rejected", "corresponding",
6013e5d0078SDavid du Colombier "committed", "environmental", "typical", "working", "timely",
6023e5d0078SDavid du Colombier "growing", "unprecedented", "new", "renewed", "fresh",
6033e5d0078SDavid du Colombier "rapid", "changing", "careful", "comprehensive", "broad",
6043e5d0078SDavid du Colombier "massive", "huge", "enormous",
6053e5d0078SDavid du Colombier "evaluated", "discresionary",
6063e5d0078SDavid du Colombier "durable", "beneficial",
6073e5d0078SDavid du Colombier "maximal", "tremendous", "minimal",
6083e5d0078SDavid du Colombier "on-site", "standardized", "standard",
6093e5d0078SDavid du Colombier "powerful", "natural", "necessary",
6103e5d0078SDavid du Colombier "reasonable", "successful",
6113e5d0078SDavid du Colombier "doubtful", "dubious", "certain",
6123e5d0078SDavid du Colombier "unified", "different", "similar", "utilitarian",
6133e5d0078SDavid du Colombier "realizable", "organizable", "motivated",
6143e5d0078SDavid du Colombier "topical", "valuable", "feasible",
6153e5d0078SDavid du Colombier "intelligent", "deliverable", "nontrivial",
6163e5d0078SDavid du Colombier "worthwhile", "complicated",
6173e5d0078SDavid du Colombier "organized", "organizing", "progressing",
6183e5d0078SDavid du Colombier "schedulable", "resourceful", "commanding",
6193e5d0078SDavid du Colombier "important", "allocatable", "temporal",
6203e5d0078SDavid du Colombier "ponderable", "understandable", "comprehendable",
6213e5d0078SDavid du Colombier "past", "present", "future",
6223e5d0078SDavid du Colombier "obvious", "considerable", "finished", "completed",
6233e5d0078SDavid du Colombier "unique", "abovementioned",
6243e5d0078SDavid du Colombier "major", "minor", "tendentious", "activating",
6253e5d0078SDavid du Colombier "actual", "added", "adequate", "affordable",
6263e5d0078SDavid du Colombier "analyzable", "additional", "intuitive",
6273e5d0078SDavid du Colombier "artificial", "good", "better",
6283e5d0078SDavid du Colombier "worse", "bad", "basic", "fundamental", "brief",
6293e5d0078SDavid du Colombier "general", "very unique", "extreme", "most unique",
6303e5d0078SDavid du Colombier "central", "proximate", "approximate", "collected",
6313e5d0078SDavid du Colombier "conductable", "comtemplatable",
6323e5d0078SDavid du Colombier "continuing", "demonstrable", "desirable",
6333e5d0078SDavid du Colombier "correctable", "foreseeable",
6343e5d0078SDavid du Colombier "discontinued", "early", "beginning",
6353e5d0078SDavid du Colombier "effectuated", "elucidated", "emotional",
6363e5d0078SDavid du Colombier "enclosed", "enthused", "entire", "exact",
6373e5d0078SDavid du Colombier "experimental", "fearful", "final",
6383e5d0078SDavid du Colombier "following", "informative",
6393e5d0078SDavid du Colombier "full", "complete", "indicated", "authorized",
6403e5d0078SDavid du Colombier "modularized", "submodularized",
6413e5d0078SDavid du Colombier "particular", "preferred", "satisfactory",
6423e5d0078SDavid du Colombier "measurable", "referenced", "literal",
6433e5d0078SDavid du Colombier "modified",
6443e5d0078SDavid du Colombier "correct", "prioritized", "prolonged",
6453e5d0078SDavid du Colombier "regrettable", "apparent",
6463e5d0078SDavid du Colombier "continued", "subsequent", "sufficient",
6473e5d0078SDavid du Colombier "suggestive", "true", "ultimate", "separate",
6483e5d0078SDavid du Colombier "purposeful", "regarded", "resulting",
6493e5d0078SDavid du Colombier "doubtful", "evident", "interesting", "worthy",
6503e5d0078SDavid du Colombier "uniform", "vital", "viable",
6513e5d0078SDavid du Colombier "worthwhile", "alternative",
6523e5d0078SDavid du Colombier "sophisticated", "employed",
6533e5d0078SDavid du Colombier "clear", "lucid", "simple", "perspicuous",
6543e5d0078SDavid du Colombier "incomplete", "concerned"};
6553e5d0078SDavid du Colombier
6563e5d0078SDavid du Colombier X
noun(env)6573e5d0078SDavid du Colombier noun(env)
6583e5d0078SDavid du Colombier E env;
6593e5d0078SDavid du Colombier {
6603e5d0078SDavid du Colombier static char *suff[] = {"ion", "sion", "tion", "age",
6613e5d0078SDavid du Colombier "ness", "ment", "ure",
6623e5d0078SDavid du Colombier "ity", "iety", "ty", "ence", "ency", "ance",
6633e5d0078SDavid du Colombier "ancy", "tude", "hood", "ture", "ate", "art", "ard",
6643e5d0078SDavid du Colombier "ism", "ine", "stress", "trix", "ess",
6653e5d0078SDavid du Colombier "dom", "ship", "eer", "ster", "ant", "ent", "ary",
6663e5d0078SDavid du Colombier "ery", "ory", "ette", "let", "ling", "ule", "kin",
6673e5d0078SDavid du Colombier "ar", "or", "ist", "fulness",
6683e5d0078SDavid du Colombier "kin", "cule", "icle", "y", "ability", "iosos"};
6693e5d0078SDavid du Colombier X nounv = getxx();
6703e5d0078SDavid du Colombier int i = 0;
6713e5d0078SDavid du Colombier nounv->type = "-noun";
6723e5d0078SDavid du Colombier if (env->number == 0)
6733e5d0078SDavid du Colombier env->number = number();
6743e5d0078SDavid du Colombier if (prob(makeup)) {
6753e5d0078SDavid du Colombier if (prob(0.05)) {
6763e5d0078SDavid du Colombier nounv->list.s[i++] = CHOOSE(adjlist);
6773e5d0078SDavid du Colombier nounv->list.s[i++] = "ness";
6783e5d0078SDavid du Colombier } else
6793e5d0078SDavid du Colombier nounv->list.s[i++] = CHOOSE(nounlist);
6803e5d0078SDavid du Colombier } else {
6813e5d0078SDavid du Colombier nounv->list.s[i++] = prefix();
6823e5d0078SDavid du Colombier nounv->list.s[i++] = root();
6833e5d0078SDavid du Colombier nounv->list.s[i++] = CHOOSE(suff);
6843e5d0078SDavid du Colombier }
6853e5d0078SDavid du Colombier if (EQ(env->number, "plural")) {
6863e5d0078SDavid du Colombier if (LAST(nounv->list.s[i - 1]) == 's')
6873e5d0078SDavid du Colombier nounv->list.s[i] = "es";
6883e5d0078SDavid du Colombier else if (LAST(nounv->list.s[i - 1]) == 'y')
6893e5d0078SDavid du Colombier nounv->list.s[i] = "ies";
6903e5d0078SDavid du Colombier else
6913e5d0078SDavid du Colombier nounv->list.s[i] = "s";
6923e5d0078SDavid du Colombier }
6933e5d0078SDavid du Colombier return nounv;
6943e5d0078SDavid du Colombier }
6953e5d0078SDavid du Colombier
6963e5d0078SDavid du Colombier X
adjval(void)6973e5d0078SDavid du Colombier adjval(void) {
6983e5d0078SDavid du Colombier X adjvalv = getxx();
6993e5d0078SDavid du Colombier int i = 0;
7003e5d0078SDavid du Colombier adjvalv->type = "adjval";
7013e5d0078SDavid du Colombier if (prob(0.25)) {
7023e5d0078SDavid du Colombier adjvalv->list.x[i++] = adverb();
7033e5d0078SDavid du Colombier }
7043e5d0078SDavid du Colombier do {
7053e5d0078SDavid du Colombier adjvalv->list.x[i++] = adjective();
7063e5d0078SDavid du Colombier } while (i < N - 1 && prob(0.25));
7073e5d0078SDavid du Colombier return adjvalv;
7083e5d0078SDavid du Colombier }
7093e5d0078SDavid du Colombier
7103e5d0078SDavid du Colombier X
nounal(env)7113e5d0078SDavid du Colombier nounal(env)
7123e5d0078SDavid du Colombier E env;
7133e5d0078SDavid du Colombier {
7143e5d0078SDavid du Colombier X nounalv = getxx();
7153e5d0078SDavid du Colombier int i = 0;
7163e5d0078SDavid du Colombier X p;
7173e5d0078SDavid du Colombier nounalv->type = "nounal";
7183e5d0078SDavid du Colombier if (prob(0.15)) {
7193e5d0078SDavid du Colombier nounalv->list.x[i++] = adjval();
7203e5d0078SDavid du Colombier }
7213e5d0078SDavid du Colombier nounalv->list.x[i++] = noun(env);
7223e5d0078SDavid du Colombier if (prob(0.15)) {
7233e5d0078SDavid du Colombier nounalv->list.x[i] = adjph(env);
7243e5d0078SDavid du Colombier }
7253e5d0078SDavid du Colombier env->an = "a";
7263e5d0078SDavid du Colombier for (p = nounalv; p->type[0] != '-'; p = p->list.x[0]);
7273e5d0078SDavid du Colombier for (i = 0; p->list.s[i]; i++) {
7283e5d0078SDavid du Colombier if (p->list.s[i][0] == 0)
7293e5d0078SDavid du Colombier continue;
7303e5d0078SDavid du Colombier if (VOWEL(p->list.s[i][0])) {
7313e5d0078SDavid du Colombier env->an = "an";
7323e5d0078SDavid du Colombier }
7333e5d0078SDavid du Colombier break;
7343e5d0078SDavid du Colombier }
7353e5d0078SDavid du Colombier return nounalv;
7363e5d0078SDavid du Colombier }
7373e5d0078SDavid du Colombier
7383e5d0078SDavid du Colombier char *
prefix(void)7393e5d0078SDavid du Colombier prefix(void) {
7403e5d0078SDavid du Colombier static char *pref[] = {
7413e5d0078SDavid du Colombier "amb", "ambi", "super", "hyper", "an", "tra", "trans", "post", "palim",
7423e5d0078SDavid du Colombier "omni", "pan", "circ", "circum", "peri", "a", "ab", "abs", "de", "apo",
7433e5d0078SDavid du Colombier "re", "ana", "mal", "ante", "pre", "fore", "pro", "infra", "para",
7443e5d0078SDavid du Colombier "inter", "ultra", "extra", "trans", "cata", "de", "oct", "octa",
7453e5d0078SDavid du Colombier "octo", "equi", "pseudo", "prim", "prot", "proto", "pent", "penta",
7463e5d0078SDavid du Colombier "quin", "quint", "quinque", "pro", "tetr", "tetra", "quad", "quadr",
7473e5d0078SDavid du Colombier "quadri", "quartet", "off", "bene", "hemi", "demi", "semi", "crypto",
7483e5d0078SDavid du Colombier "cent", "centi", "hecto", "en", "em", "in", "im", "intro", "be",
7493e5d0078SDavid du Colombier "macro", "poly", "mult", "multi", "neo", "nona", "novem", "ennea",
7503e5d0078SDavid du Colombier "in", "un", "im", "il", "ir", "non", "a", "nil", "paleo", "mon", "mono",
7513e5d0078SDavid du Colombier "uni", "e", "ex", "ec", "ef", "super", "supr", "sur", "hyper", "vic",
7523e5d0078SDavid du Colombier "vice", "hept", "hepta", "sept", "septe", "septem", "septi", "hex",
7533e5d0078SDavid du Colombier "hexa", "sex", "dis", "deca", "deka", "deci", "kilo", "mill", "milli",
7543e5d0078SDavid du Colombier "tri", "per", "dia", "ad", "com", "di", "amphi", "bi", "bin", "bis",
7553e5d0078SDavid du Colombier "sub", "hypo", "epi", "eu", "holo"};
7563e5d0078SDavid du Colombier if (prob(0.65))
7573e5d0078SDavid du Colombier return "";
7583e5d0078SDavid du Colombier return CHOOSE(pref);
7593e5d0078SDavid du Colombier }
7603e5d0078SDavid du Colombier
7613e5d0078SDavid du Colombier char *
root(void)7623e5d0078SDavid du Colombier root(void) {
7633e5d0078SDavid du Colombier static char *root[] = {
7643e5d0078SDavid du Colombier "pan", "omni", "arch", "zo", "rog", "rogat", "cred", "flect", "flex",
7653e5d0078SDavid du Colombier "test", "hem", "hemato", "nasc", "nat", "bibl", "fer", "voc", "port", "lat",
7663e5d0078SDavid du Colombier "fortuna", "ped", "chrom", "vinc", "vict", "crea", "cise", "mort", "mors",
7673e5d0078SDavid du Colombier "necr", "claim", "clam", "hetero", "pel", "puls", "vac", "iso", "phobe",
7683e5d0078SDavid du Colombier "phobia", "prim", "prime", "flu", "flux", "sequ", "liber", "liver", "theo",
7693e5d0078SDavid du Colombier "magna", "medi", "man", "manu", "pen", "pend", "pens", "eu", "capit",
7703e5d0078SDavid du Colombier "iatr", "aud", "aus", "cor", "cord", "cour", "grav", "ten", "tain",
7713e5d0078SDavid du Colombier "tent", "sacr", "sacer", "heiro", "sanct", "cide", "mega", "ultima",
7723e5d0078SDavid du Colombier "ridi", "risi", "leg", "jus", "jur", "nom", "duc", "duct", "duce",
7733e5d0078SDavid du Colombier "bio", "viv", "vivi", "vita", "lus", "lum", "luc", "photo",
7743e5d0078SDavid du Colombier "min", "philo", "phile", "phila", "amic", "anthrop", "poly", "multi",
7753e5d0078SDavid du Colombier "fac", "fact", "fic", "fect", "meter", "psych", "mod", "mot", "mov",
7763e5d0078SDavid du Colombier "nov", "neo", "neg", "uni", "alter", "ali", "idio", "pop", "dem",
7773e5d0078SDavid du Colombier "demo", "lic", "licit", "poten", "posse", "potes", "mem", "simul",
7783e5d0078SDavid du Colombier "arch", "homo", "mar", "mer", "vis", "vid", "scope", "auto", "mitt",
7793e5d0078SDavid du Colombier "miss", "ac", "acr", "brev", "clud", "clus", "dorm", "micro", "aster",
7803e5d0078SDavid du Colombier "astro", "rect", "recti", "forc", "fort", "path", "cap", "cep", "cept",
7813e5d0078SDavid du Colombier "put", "tempo", "tempor", "dent", "dont", "ver", "veri",
7823e5d0078SDavid du Colombier "feder", "fide", "feal", "fid", "cosm", "migra", "hydro", "aqu",
7833e5d0078SDavid du Colombier "endo", "gyn", "logo", "opus", "oper", "graph", "scrib", "scrip",
7843e5d0078SDavid du Colombier "mis", "miso", "anni", "annu", "enni", "ced", "cede", "ceed", "cess"};
7853e5d0078SDavid du Colombier return CHOOSE(root);
7863e5d0078SDavid du Colombier }
7873e5d0078SDavid du Colombier
prob(f)7883e5d0078SDavid du Colombier prob(f)
7893e5d0078SDavid du Colombier double f;
7903e5d0078SDavid du Colombier {
7913e5d0078SDavid du Colombier return (R) < (f * 32767.0);
7923e5d0078SDavid du Colombier }
7933e5d0078SDavid du Colombier
7943e5d0078SDavid du Colombier char *
tense()7953e5d0078SDavid du Colombier tense()
7963e5d0078SDavid du Colombier {
7973e5d0078SDavid du Colombier return prob(0.5) ? "pres" : "past";
7983e5d0078SDavid du Colombier }
7993e5d0078SDavid du Colombier
8003e5d0078SDavid du Colombier char *
number()8013e5d0078SDavid du Colombier number()
8023e5d0078SDavid du Colombier {
8033e5d0078SDavid du Colombier return prob(0.25) ? "plural" : "sing";
8043e5d0078SDavid du Colombier }
8053e5d0078SDavid du Colombier
8063e5d0078SDavid du Colombier X
getxx()8073e5d0078SDavid du Colombier getxx()
8083e5d0078SDavid du Colombier {
8093e5d0078SDavid du Colombier X rv;
8103e5d0078SDavid du Colombier static XX empty;
8113e5d0078SDavid du Colombier
8123e5d0078SDavid du Colombier rv = (X) malloc(sizeof *rv);
8133e5d0078SDavid du Colombier if (rv == 0) {
814*27d75179SDavid du Colombier fprint(2, "festoon: outa space\n");
8153e5d0078SDavid du Colombier exits("space");
8163e5d0078SDavid du Colombier }
8173e5d0078SDavid du Colombier *rv = empty;
8183e5d0078SDavid du Colombier return rv;
8193e5d0078SDavid du Colombier }
8203e5d0078SDavid du Colombier
8213e5d0078SDavid du Colombier X
verbal(env)8223e5d0078SDavid du Colombier verbal(env)
8233e5d0078SDavid du Colombier E env;
8243e5d0078SDavid du Colombier {
8253e5d0078SDavid du Colombier X verbalv = getxx();
8263e5d0078SDavid du Colombier int i = 0;
8273e5d0078SDavid du Colombier verbalv->type = "verbal";
8283e5d0078SDavid du Colombier if (prob(0.25))
8293e5d0078SDavid du Colombier verbalv->list.x[i++] = adverb();
8303e5d0078SDavid du Colombier verbalv->list.x[i] = verb(env);
8313e5d0078SDavid du Colombier return verbalv;
8323e5d0078SDavid du Colombier }
8333e5d0078SDavid du Colombier
8343e5d0078SDavid du Colombier static char *advlist[] = {"absolutely", "functionally",
8353e5d0078SDavid du Colombier "accordingly", "broadly", "actionably", "actually",
8363e5d0078SDavid du Colombier "additionally",
8373e5d0078SDavid du Colombier "ambiguously", "amply",
8383e5d0078SDavid du Colombier "analogously",
8393e5d0078SDavid du Colombier "aperiodically",
8403e5d0078SDavid du Colombier "apparently", "appreciably",
8413e5d0078SDavid du Colombier "appropriately", "approximately",
8423e5d0078SDavid du Colombier "arbitrarily",
8433e5d0078SDavid du Colombier "associatively",
8443e5d0078SDavid du Colombier "automatically",
8453e5d0078SDavid du Colombier "awfully",
8463e5d0078SDavid du Colombier "axiomatically",
8473e5d0078SDavid du Colombier "badly", "barely", "basically",
8483e5d0078SDavid du Colombier "beneficially",
8493e5d0078SDavid du Colombier "blatantly",
8503e5d0078SDavid du Colombier "capably", "carefully", "carelessly",
8513e5d0078SDavid du Colombier "casually", "causally", "cautiously",
8523e5d0078SDavid du Colombier "centrally", "certainly",
8533e5d0078SDavid du Colombier "cheaply", "cleanly",
8543e5d0078SDavid du Colombier "closely", "coarsely", "cognizantly",
8553e5d0078SDavid du Colombier "coincidentally", "collectively", "collaterally",
8563e5d0078SDavid du Colombier "comparably",
8573e5d0078SDavid du Colombier "competently", "completely", "comprehensibly",
8583e5d0078SDavid du Colombier "concededly", "conceivably",
8593e5d0078SDavid du Colombier "concisely", "conclusively", "concretely",
8603e5d0078SDavid du Colombier "concurrently", "conjecturally",
8613e5d0078SDavid du Colombier "currently",
8623e5d0078SDavid du Colombier "conscientously", "consequently", "consequentially",
8633e5d0078SDavid du Colombier "consistently", "constantly",
8643e5d0078SDavid du Colombier "contemporaneuosly", "constructively",
8653e5d0078SDavid du Colombier "continually", "continuously", "contractually",
8663e5d0078SDavid du Colombier "contrarily", "contributatively", "conveniently",
8673e5d0078SDavid du Colombier "conventionally",
8683e5d0078SDavid du Colombier "correctively",
8693e5d0078SDavid du Colombier "correctly",
8703e5d0078SDavid du Colombier "crudely",
8713e5d0078SDavid du Colombier "curiously",
8723e5d0078SDavid du Colombier "decidedly",
8733e5d0078SDavid du Colombier "deeply",
8743e5d0078SDavid du Colombier "deficiently", "demandingly",
8753e5d0078SDavid du Colombier "dependably", "desireably",
8763e5d0078SDavid du Colombier "determinately", "diagnostically",
8773e5d0078SDavid du Colombier "differentially", "differently",
8783e5d0078SDavid du Colombier "directly", "discernibly",
8793e5d0078SDavid du Colombier "distinctly", "doubtfully", "dramatically",
8803e5d0078SDavid du Colombier "dynamically",
8813e5d0078SDavid du Colombier "economically",
8823e5d0078SDavid du Colombier "effecaciously", "efficiently",
8833e5d0078SDavid du Colombier "elegantly",
8843e5d0078SDavid du Colombier "emphatically", "encouragingly",
8853e5d0078SDavid du Colombier "endlessly", "endurably",
8863e5d0078SDavid du Colombier "entirely", "epistomologically",
8873e5d0078SDavid du Colombier "functionally", "immediately",
8883e5d0078SDavid du Colombier "equably", "equally", "equitably", "erroneously",
8893e5d0078SDavid du Colombier "esoterically", "eternally", "evenly", "eventfully",
8903e5d0078SDavid du Colombier "eventually", "evidently",
8913e5d0078SDavid du Colombier "exceedingly", "exactly", "excellently",
8923e5d0078SDavid du Colombier "exceptionally", "excessively", "exclusively",
8933e5d0078SDavid du Colombier "experimentally",
8943e5d0078SDavid du Colombier "explicitly", "extremely",
8953e5d0078SDavid du Colombier "factually", "faithfully",
8963e5d0078SDavid du Colombier "faultlessly", "feasibly",
8973e5d0078SDavid du Colombier "finitely", "firmly", "forcefully",
8983e5d0078SDavid du Colombier "formally", "formerly", "frankly", "freely",
8993e5d0078SDavid du Colombier "frugally", "fully", "generally",
9003e5d0078SDavid du Colombier "globally", "gradually",
9013e5d0078SDavid du Colombier "harmlessly",
9023e5d0078SDavid du Colombier "helpfully",
9033e5d0078SDavid du Colombier "highly", "homogeneously",
9043e5d0078SDavid du Colombier "hopefully",
9053e5d0078SDavid du Colombier "ideally", "identically", "ideologically",
9063e5d0078SDavid du Colombier "idiomatically", "idiosyncratically", "idly",
9073e5d0078SDavid du Colombier "imaginably", "immaterially", "immensely",
9083e5d0078SDavid du Colombier "impartially", "imperceptably", "imperfectly", "importantly",
9093e5d0078SDavid du Colombier "improperly", "imprudently", "inaccurately", "inappropriately",
9103e5d0078SDavid du Colombier "accurately",
9113e5d0078SDavid du Colombier "inclusively", "incompletely", "incorrectly",
9123e5d0078SDavid du Colombier "increasingly", "independently",
9133e5d0078SDavid du Colombier "indirectly", "ineffectively", "ineffectually", "inefficiently",
9143e5d0078SDavid du Colombier "infallibly", "instantaneously", "instantly",
9153e5d0078SDavid du Colombier "insufficiently", "internally", "likely", "only",
9163e5d0078SDavid du Colombier "invaluably", "inversely", "irrelevantly", "irrespectively",
9173e5d0078SDavid du Colombier "largely", "lastly", "legitimately", "literally",
9183e5d0078SDavid du Colombier "locally", "loosely", "manageably", "markedly",
9193e5d0078SDavid du Colombier "memorably", "mildly", "mindfully", "moderately",
9203e5d0078SDavid du Colombier "momentarily", "naturally", "needfully", "needlessly",
9213e5d0078SDavid du Colombier "nominally", "normally", "objectively", "occasionally",
9223e5d0078SDavid du Colombier "temporarily",
9233e5d0078SDavid du Colombier "officially", "oppositely", "ordinarily", "ostensibly",
9243e5d0078SDavid du Colombier "partially", "permissibly",
9253e5d0078SDavid du Colombier "personally", "pertinently",
9263e5d0078SDavid du Colombier "physically", "plainly", "plainly",
9273e5d0078SDavid du Colombier "pleasingly", "politically",
9283e5d0078SDavid du Colombier "potentially", "predictively",
9293e5d0078SDavid du Colombier "predominantly", "prematurely", "preparedly", "presently",
9303e5d0078SDavid du Colombier "previously", "primarily",
9313e5d0078SDavid du Colombier "primely", "principally", "problematically",
9323e5d0078SDavid du Colombier "productively", "promptly", "proportionately",
9333e5d0078SDavid du Colombier "provably", "purely", "quickly", "radically", "randomly", "recently",
9343e5d0078SDavid du Colombier "repeatedly", "secondarily", "separately",
9353e5d0078SDavid du Colombier "usually", "specifically",
9363e5d0078SDavid du Colombier "redundantly", "regardlessly", "reliably",
9373e5d0078SDavid du Colombier "remarkably", "remotely", "respectively",
9383e5d0078SDavid du Colombier "probably",
9393e5d0078SDavid du Colombier "robustly", "seemingly",
9403e5d0078SDavid du Colombier "sensibly", "singularly", "steadily",
9413e5d0078SDavid du Colombier "strikingly", "substantially", "successfully",
9423e5d0078SDavid du Colombier "supposedly", "systematically", "understandably",
9433e5d0078SDavid du Colombier "necessarily", "unfortunately",
9443e5d0078SDavid du Colombier "unnecessarily", "unmistakably", "usefully", "weakly"};
9453e5d0078SDavid du Colombier
9463e5d0078SDavid du Colombier X
adverb(void)9473e5d0078SDavid du Colombier adverb(void) {
9483e5d0078SDavid du Colombier static char *wordy[] = {"very ", "extremely ", "generally ",
9493e5d0078SDavid du Colombier "reasonably ", "fundamentally ", "essentially ", "particularly ",
9503e5d0078SDavid du Colombier "very ",
9513e5d0078SDavid du Colombier "very ", "very ",
9523e5d0078SDavid du Colombier "very ", "very ",
9533e5d0078SDavid du Colombier "very ", "very ",
9543e5d0078SDavid du Colombier "very ", "very ",
9553e5d0078SDavid du Colombier "very ", "very ",
9563e5d0078SDavid du Colombier "very ", "very ",
9573e5d0078SDavid du Colombier "very ", "very ",
9583e5d0078SDavid du Colombier "entirely ",
9593e5d0078SDavid du Colombier "rather ", "fairly ", "relatively ", "comparatively ",
9603e5d0078SDavid du Colombier "moderately ",
9613e5d0078SDavid du Colombier "totally ", "very ", "quite "};
9623e5d0078SDavid du Colombier static char *suff[] = {"wardly", "ably", "wisely",
9633e5d0078SDavid du Colombier "ably", "ily", "ly", "ly", "ly"};
9643e5d0078SDavid du Colombier
9653e5d0078SDavid du Colombier X adverbv = getxx();
9663e5d0078SDavid du Colombier int i = 0;
9673e5d0078SDavid du Colombier
9683e5d0078SDavid du Colombier adverbv->type = "-adverb";
9693e5d0078SDavid du Colombier if (prob(0.150)) {
9703e5d0078SDavid du Colombier adverbv->list.s[i] = prob(.5) ? "simply" : "easily";
9713e5d0078SDavid du Colombier return adverbv;
9723e5d0078SDavid du Colombier }
9733e5d0078SDavid du Colombier if (prob(0.4))
9743e5d0078SDavid du Colombier adverbv->list.s[i++] = CHOOSE(wordy);
9753e5d0078SDavid du Colombier if (prob(makeup))
9763e5d0078SDavid du Colombier adverbv->list.s[i] = CHOOSE(advlist);
9773e5d0078SDavid du Colombier else {
9783e5d0078SDavid du Colombier adverbv->list.s[i++] = prefix();
9793e5d0078SDavid du Colombier adverbv->list.s[i++] = root();
9803e5d0078SDavid du Colombier adverbv->list.s[i] = CHOOSE(suff);
9813e5d0078SDavid du Colombier }
9823e5d0078SDavid du Colombier return adverbv;
9833e5d0078SDavid du Colombier }
9843e5d0078SDavid du Colombier
9853e5d0078SDavid du Colombier X
adjective(void)9863e5d0078SDavid du Colombier adjective(void) {
9873e5d0078SDavid du Colombier static char *suff[] = {"ive", "ful", "ous", "some", "oid",
9883e5d0078SDavid du Colombier "ine", "esque", "en", "an",
9893e5d0078SDavid du Colombier "ile", "able", "ible", "istic", "ic",
9903e5d0078SDavid du Colombier "an", "ian", "ish", "ite", "al", "less"};
9913e5d0078SDavid du Colombier X adjv = getxx();
9923e5d0078SDavid du Colombier int i = 0;
9933e5d0078SDavid du Colombier
9943e5d0078SDavid du Colombier adjv->type = "-adjective";
9953e5d0078SDavid du Colombier if (prob(0.2)) {
9963e5d0078SDavid du Colombier adjv->list.s[i++] = "not ";
9973e5d0078SDavid du Colombier adjv->list.s[i++] = "un";
9983e5d0078SDavid du Colombier }
9993e5d0078SDavid du Colombier if (prob(makeup)) {
10003e5d0078SDavid du Colombier adjv->list.s[i] = CHOOSE(adjlist);
10013e5d0078SDavid du Colombier return adjv;
10023e5d0078SDavid du Colombier }
10033e5d0078SDavid du Colombier adjv->list.s[i++] = prefix();
10043e5d0078SDavid du Colombier adjv->list.s[i++] = root();
10053e5d0078SDavid du Colombier adjv->list.s[i] = CHOOSE(suff);
10063e5d0078SDavid du Colombier return adjv;
10073e5d0078SDavid du Colombier }
10083e5d0078SDavid du Colombier
10093e5d0078SDavid du Colombier X
adjph(env)10103e5d0078SDavid du Colombier adjph(env)
10113e5d0078SDavid du Colombier E env;
10123e5d0078SDavid du Colombier {
10133e5d0078SDavid du Colombier X adjv = getxx();
10143e5d0078SDavid du Colombier EE nenv;
10153e5d0078SDavid du Colombier static EE empty;
10163e5d0078SDavid du Colombier int i = 0;
10173e5d0078SDavid du Colombier adjv->type = "adjph";
10183e5d0078SDavid du Colombier if (prob(0.25)) {
10193e5d0078SDavid du Colombier nenv = *env;
10203e5d0078SDavid du Colombier nenv.tense = 0;
10213e5d0078SDavid du Colombier adjv->list.x[i++] = rel();
10223e5d0078SDavid du Colombier adjv->list.x[i++] = aux(&nenv);
10233e5d0078SDavid du Colombier adjv->list.x[i] = vp(&nenv);
10243e5d0078SDavid du Colombier return adjv;
10253e5d0078SDavid du Colombier }
10263e5d0078SDavid du Colombier nenv = empty;
10273e5d0078SDavid du Colombier adjv->list.x[i++] = prep();
10283e5d0078SDavid du Colombier adjv->list.x[i] = np(&nenv);
10293e5d0078SDavid du Colombier return adjv;
10303e5d0078SDavid du Colombier }
10313e5d0078SDavid du Colombier
10323e5d0078SDavid du Colombier static char *preplist[] = {"across", "by", "in", "of",
10333e5d0078SDavid du Colombier "near", "under", "over",
10343e5d0078SDavid du Colombier "in back of", "below", "behind", "of", "of", "of", "of",
10353e5d0078SDavid du Colombier "centered around", "centered about",
10363e5d0078SDavid du Colombier "in close proximity to", "following after",
10373e5d0078SDavid du Colombier "in between", "in conflict with", "in conjunction with",
10383e5d0078SDavid du Colombier "in the area of", "in the neighborhood of", "in the proximity of",
10393e5d0078SDavid du Colombier "in the field of", "for the purpose of",
10403e5d0078SDavid du Colombier "giving rise to", "based upon", "being caused by",
10413e5d0078SDavid du Colombier "of", "of", "of", "of",
10423e5d0078SDavid du Colombier "being effectuated by", "being aggrevated by",
10433e5d0078SDavid du Colombier "being used with",
10443e5d0078SDavid du Colombier "being collected together with", "being combined together with",
10453e5d0078SDavid du Colombier "connected up to", "exhibiting a tendency towards",
10463e5d0078SDavid du Colombier "being facilitated by",
10473e5d0078SDavid du Colombier "being employed with",
10483e5d0078SDavid du Colombier "having a deleterious effect upon", "impacting",
10493e5d0078SDavid du Colombier "being joined together with", "being merged together with",
10503e5d0078SDavid du Colombier "in the vicinity of"};
10513e5d0078SDavid du Colombier
10523e5d0078SDavid du Colombier X
prep(void)10533e5d0078SDavid du Colombier prep(void) {
10543e5d0078SDavid du Colombier X pv = getxx();
10553e5d0078SDavid du Colombier pv->type = "-prep";
10563e5d0078SDavid du Colombier pv->list.s[0] = CHOOSE(preplist);
10573e5d0078SDavid du Colombier return pv;
10583e5d0078SDavid du Colombier }
10593e5d0078SDavid du Colombier
10603e5d0078SDavid du Colombier X
comp(env)10613e5d0078SDavid du Colombier comp(env)
10623e5d0078SDavid du Colombier E env;
10633e5d0078SDavid du Colombier {
10643e5d0078SDavid du Colombier X v = getxx();
10653e5d0078SDavid du Colombier EE nenv;
10663e5d0078SDavid du Colombier static EE empty;
10673e5d0078SDavid du Colombier int i = 0;
10683e5d0078SDavid du Colombier nenv = empty;
10693e5d0078SDavid du Colombier v->type = "comp";
10703e5d0078SDavid du Colombier if (0 && prob(0.001))
10713e5d0078SDavid du Colombier v->list.x[i++] = adjective();
10723e5d0078SDavid du Colombier else if (prob(0.1))
10733e5d0078SDavid du Colombier v->list.x[i++] = advp(&nenv);
10743e5d0078SDavid du Colombier else {
10753e5d0078SDavid du Colombier if (env->passive)
10763e5d0078SDavid du Colombier v->list.x[i++] = passprep();
10773e5d0078SDavid du Colombier v->list.x[i++] = np(&nenv);
10783e5d0078SDavid du Colombier env->passive = 0;
10793e5d0078SDavid du Colombier }
10803e5d0078SDavid du Colombier if (0 && prob(0.05))
10813e5d0078SDavid du Colombier v->list.x[i++] = adverb();
10823e5d0078SDavid du Colombier USED(i);
10833e5d0078SDavid du Colombier return v;
10843e5d0078SDavid du Colombier }
10853e5d0078SDavid du Colombier
10863e5d0078SDavid du Colombier X
advp(env)10873e5d0078SDavid du Colombier advp(env)
10883e5d0078SDavid du Colombier E env;
10893e5d0078SDavid du Colombier {
10903e5d0078SDavid du Colombier X v = getxx();
10913e5d0078SDavid du Colombier v->type = "advp";
10923e5d0078SDavid du Colombier v->list.x[0] = vprep();
10933e5d0078SDavid du Colombier v->list.x[1] = np(env);
10943e5d0078SDavid du Colombier return v;
10953e5d0078SDavid du Colombier }
10963e5d0078SDavid du Colombier
10973e5d0078SDavid du Colombier static char *vpreplist[] = {"to", "at", "by", "from", "with", "for"};
10983e5d0078SDavid du Colombier
10993e5d0078SDavid du Colombier X
vprep(void)11003e5d0078SDavid du Colombier vprep(void) {
11013e5d0078SDavid du Colombier X v = getxx();
11023e5d0078SDavid du Colombier v->type = "-vprep";
11033e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(vpreplist);
11043e5d0078SDavid du Colombier return v;
11053e5d0078SDavid du Colombier }
11063e5d0078SDavid du Colombier
11073e5d0078SDavid du Colombier E
getenvq()11083e5d0078SDavid du Colombier getenvq()
11093e5d0078SDavid du Colombier {
11103e5d0078SDavid du Colombier static EE empty;
11113e5d0078SDavid du Colombier E v;
11123e5d0078SDavid du Colombier v = (E) malloc(sizeof *v);
11133e5d0078SDavid du Colombier if (v == 0) {
1114*27d75179SDavid du Colombier print("outa room\n");
11153e5d0078SDavid du Colombier exits("room");
11163e5d0078SDavid du Colombier }
11173e5d0078SDavid du Colombier *v = empty;
11183e5d0078SDavid du Colombier return v;
11193e5d0078SDavid du Colombier }
11203e5d0078SDavid du Colombier
11213e5d0078SDavid du Colombier X
comma(env)11223e5d0078SDavid du Colombier comma(env)
11233e5d0078SDavid du Colombier E env;
11243e5d0078SDavid du Colombier {
11253e5d0078SDavid du Colombier X v = getxx();
11263e5d0078SDavid du Colombier static EE empty;
11273e5d0078SDavid du Colombier
11283e5d0078SDavid du Colombier v->type = "-comma";
11293e5d0078SDavid du Colombier v->list.s[0] = ",";
11303e5d0078SDavid du Colombier *env = empty;
11313e5d0078SDavid du Colombier return v;
11323e5d0078SDavid du Colombier }
11333e5d0078SDavid du Colombier
11343e5d0078SDavid du Colombier static char *conjadvlist[] = {"we believe", "naturally", "therefore",
11353e5d0078SDavid du Colombier "moreover", "obviously"};
11363e5d0078SDavid du Colombier
11373e5d0078SDavid du Colombier X
conjadv(void)11383e5d0078SDavid du Colombier conjadv(void) {
11393e5d0078SDavid du Colombier X v = getxx();
11403e5d0078SDavid du Colombier
11413e5d0078SDavid du Colombier v->type = "-conjadv";
11423e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(conjadvlist);
11433e5d0078SDavid du Colombier return v;
11443e5d0078SDavid du Colombier }
11453e5d0078SDavid du Colombier
11463e5d0078SDavid du Colombier static char *lconjlist[] = {"therefore", "however", "nevertheless",
11473e5d0078SDavid du Colombier "consequently", "also", "in addition", "moreover",
11483e5d0078SDavid du Colombier "accordingly", "essentially", "presumably", "actually",
11493e5d0078SDavid du Colombier "basically", "importantly", "clearly", "obviously",
11503e5d0078SDavid du Colombier "needless to say", "as already stated",
11513e5d0078SDavid du Colombier "generally", "approximately", "presently",
11523e5d0078SDavid du Colombier "hopefully", "usually", "in the great majority of cases",
11533e5d0078SDavid du Colombier "seen in the above light", "most significantly",
11543e5d0078SDavid du Colombier "when the need arises",
11553e5d0078SDavid du Colombier "in a large number of cases", "after this is accomplished",
11563e5d0078SDavid du Colombier "in all cases",
11573e5d0078SDavid du Colombier "having been made aware concerning these matters",
11583e5d0078SDavid du Colombier "as an example of this", "as a consequence of this",
11593e5d0078SDavid du Colombier "as a matter of fact", "as is often the case",
11603e5d0078SDavid du Colombier "as of this date", "assuming that this is the case",
11613e5d0078SDavid du Colombier "at the present moment in time", "at this time",
11623e5d0078SDavid du Colombier "as a consequent result of this", "as a desireable benefit of this",
11633e5d0078SDavid du Colombier "if at all possible", "similarly", "in the same connection",
11643e5d0078SDavid du Colombier "in large measure", "in many cases", "in rare cases",
11653e5d0078SDavid du Colombier "in some cases", "in the interim", "in the last analysis",
11663e5d0078SDavid du Colombier "in light of these facts", "in the majority of instances",
11673e5d0078SDavid du Colombier "in the not too distant future", "in the same way as described above",
11683e5d0078SDavid du Colombier "in this case", "for all intents and purposes",
11693e5d0078SDavid du Colombier "to arrive at an approximation", "for this reason",
11703e5d0078SDavid du Colombier "for many reasons, then",
11713e5d0078SDavid du Colombier "as is often the case", "last but not least",
11723e5d0078SDavid du Colombier "later on", "on a few occasions", "on this occasion",
11733e5d0078SDavid du Colombier "in summary", "taking this into consideration",
11743e5d0078SDavid du Colombier "with this in mind",
11753e5d0078SDavid du Colombier "substantially", "ultimately"};
11763e5d0078SDavid du Colombier
11773e5d0078SDavid du Colombier X
lconjadv(void)11783e5d0078SDavid du Colombier lconjadv(void) {
11793e5d0078SDavid du Colombier
11803e5d0078SDavid du Colombier X v = getxx();
11813e5d0078SDavid du Colombier v->type = "-lconjadv";
11823e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(lconjlist);
11833e5d0078SDavid du Colombier return v;
11843e5d0078SDavid du Colombier }
11853e5d0078SDavid du Colombier
11863e5d0078SDavid du Colombier X
conjsub(void)11873e5d0078SDavid du Colombier conjsub(void) {
11883e5d0078SDavid du Colombier static char *conjsublist[] = {"although", "even though",
11893e5d0078SDavid du Colombier "despite the fact that",
11903e5d0078SDavid du Colombier "for the simple reason that",
11913e5d0078SDavid du Colombier "because", "due to the fact that", "since",
11923e5d0078SDavid du Colombier "whether or not",
11933e5d0078SDavid du Colombier "inasmuch as",
11943e5d0078SDavid du Colombier "as"};
11953e5d0078SDavid du Colombier X v = getxx();
11963e5d0078SDavid du Colombier v->type = "-conjsub";
11973e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(conjsublist);
11983e5d0078SDavid du Colombier return v;
11993e5d0078SDavid du Colombier }
12003e5d0078SDavid du Colombier
12013e5d0078SDavid du Colombier static char *lconjsublist[] = {"although", "even though",
12023e5d0078SDavid du Colombier "despite the fact that",
12033e5d0078SDavid du Colombier "because", "due to the fact that", "since",
12043e5d0078SDavid du Colombier "if", "anytime that", "in the case that",
12053e5d0078SDavid du Colombier "as a consequence of the fact that",
12063e5d0078SDavid du Colombier "as regards the fact that",
12073e5d0078SDavid du Colombier "as a desireable benefit of the fact that",
12083e5d0078SDavid du Colombier "with reference to the fact that",
12093e5d0078SDavid du Colombier "as long as",
12103e5d0078SDavid du Colombier "as an important essential of the fact that",
12113e5d0078SDavid du Colombier "in conjunction with the fact that",
12123e5d0078SDavid du Colombier "in the light of the fact that",
12133e5d0078SDavid du Colombier "if", "if", "if", "if",
12143e5d0078SDavid du Colombier "leaving out of consideration the fact that",
12153e5d0078SDavid du Colombier "just as",
12163e5d0078SDavid du Colombier "inasmuch as", "until such time as",
12173e5d0078SDavid du Colombier "as soon as", "being as", "in the same way as",
12183e5d0078SDavid du Colombier "with the exception of the fact that",
12193e5d0078SDavid du Colombier "notwithstanding the fact that",
12203e5d0078SDavid du Colombier "on the grounds that",
12213e5d0078SDavid du Colombier "on the basis of the fact that",
12223e5d0078SDavid du Colombier "persuant to the fact that",
12233e5d0078SDavid du Colombier "although it seems apparent that",
12243e5d0078SDavid du Colombier "with regard to the fact that",
12253e5d0078SDavid du Colombier "as can be seen from the fact that",
12263e5d0078SDavid du Colombier "as"};
12273e5d0078SDavid du Colombier
12283e5d0078SDavid du Colombier X
lconjsub(void)12293e5d0078SDavid du Colombier lconjsub(void) {
12303e5d0078SDavid du Colombier X v = getxx();
12313e5d0078SDavid du Colombier v->type = "-lconjsub";
12323e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(lconjsublist);
12333e5d0078SDavid du Colombier return v;
12343e5d0078SDavid du Colombier }
12353e5d0078SDavid du Colombier
12363e5d0078SDavid du Colombier static char *conjlist[] = {"and", "but", "yet", "and", "and"};
12373e5d0078SDavid du Colombier
12383e5d0078SDavid du Colombier X
conj(void)12393e5d0078SDavid du Colombier conj(void) {
12403e5d0078SDavid du Colombier X v = getxx();
12413e5d0078SDavid du Colombier v->type = "-conj";
12423e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(conjlist);
12433e5d0078SDavid du Colombier return v;
12443e5d0078SDavid du Colombier }
12453e5d0078SDavid du Colombier static char *nomzlist[] = {"it is easy to see that",
12463e5d0078SDavid du Colombier "it is a basic fact that",
12473e5d0078SDavid du Colombier "it is obvious that", "it is not unimportant that",
12483e5d0078SDavid du Colombier "it is easy to overlook the fact that",
12493e5d0078SDavid du Colombier "it is within the realm of possibility that",
12503e5d0078SDavid du Colombier "it is apparent that",
12513e5d0078SDavid du Colombier "this is indicitive of the fact that",
12523e5d0078SDavid du Colombier "this is in substantial agreement with the fact that",
12533e5d0078SDavid du Colombier "this demonstrates the fact that",
12543e5d0078SDavid du Colombier "this leaves out of consideration the fact that",
12553e5d0078SDavid du Colombier "it is of the utmost importance that",
12563e5d0078SDavid du Colombier "the truth is that",
12573e5d0078SDavid du Colombier "the fact is that",
12583e5d0078SDavid du Colombier "it turns out that", "it will turn out to be true that",
12593e5d0078SDavid du Colombier "it should be noted that",
12603e5d0078SDavid du Colombier "it stands to reason that",
12613e5d0078SDavid du Colombier "it would not be unreasonable to assume that",
12623e5d0078SDavid du Colombier "it is interesting to note that",
12633e5d0078SDavid du Colombier "this can be proved by:",
12643e5d0078SDavid du Colombier "this is a trivial consequence of",
12653e5d0078SDavid du Colombier "it is assumed that",
12663e5d0078SDavid du Colombier "it remains to be shown that",
12673e5d0078SDavid du Colombier "it is left to the reader to prove"
12683e5d0078SDavid du Colombier };
12693e5d0078SDavid du Colombier
12703e5d0078SDavid du Colombier X
nomz(void)12713e5d0078SDavid du Colombier nomz(void) {
12723e5d0078SDavid du Colombier X v = getxx();
12733e5d0078SDavid du Colombier v->type = "-nomz";
12743e5d0078SDavid du Colombier v->list.s[0] = CHOOSE(nomzlist);
12753e5d0078SDavid du Colombier return v;
12763e5d0078SDavid du Colombier }
12773e5d0078SDavid du Colombier
12783e5d0078SDavid du Colombier X
equation(void)12793e5d0078SDavid du Colombier equation(void) {
12803e5d0078SDavid du Colombier X v = getxx();
12813e5d0078SDavid du Colombier static char eqnbuff[100], x;
12823e5d0078SDavid du Colombier static char *eqnelem[] = {"int", "sum", "prod", "union", "inter"};
12833e5d0078SDavid du Colombier static char *eqnfn[] = { "sin", "cos", "tan", "arc", "det",
12843e5d0078SDavid du Colombier "log", "exp", "f", "g", "sinh", "O", "J sub 0", "J sub 1",
12853e5d0078SDavid du Colombier "P sub i", "gamma", "zeta" };
12863e5d0078SDavid du Colombier static char *eqnval[] = { "0", "DELTA", "GAMMA", "LAMBDA",
12873e5d0078SDavid du Colombier "OMEGA", "PHI", "PSI", "SIGMA", "THETA", "UPSILON",
12883e5d0078SDavid du Colombier "XI", "alpha", "beta", "gamma", "delta", "epsilon",
12893e5d0078SDavid du Colombier "eta", "kappa","lambda", "mu", "omega", "x", "zeta", "inf"};
12903e5d0078SDavid du Colombier static char *eqnrel[] = {"=", "<=", ">=", "==", "!=", "approx"};
12913e5d0078SDavid du Colombier
12923e5d0078SDavid du Colombier x = 'a' + (R)%26;
12933e5d0078SDavid du Colombier v->type = "-eqn";
1294*27d75179SDavid du Colombier sprint(eqnbuff,"$%s from %c=%d to %s %s ( %c ) d%c %s %s$",
12953e5d0078SDavid du Colombier CHOOSE(eqnelem), x, (R)&077, CHOOSE(eqnval), CHOOSE(eqnfn),
12963e5d0078SDavid du Colombier x, x, CHOOSE(eqnrel), CHOOSE(eqnval));
12973e5d0078SDavid du Colombier v->list.s[0] = eqnbuff;
12983e5d0078SDavid du Colombier return v;
12993e5d0078SDavid du Colombier }
13003e5d0078SDavid du Colombier
13013e5d0078SDavid du Colombier X
turgid(env)13023e5d0078SDavid du Colombier turgid(env)
13033e5d0078SDavid du Colombier E env;
13043e5d0078SDavid du Colombier {
13053e5d0078SDavid du Colombier X v = getxx();
13063e5d0078SDavid du Colombier int i = 0;
13073e5d0078SDavid du Colombier
13083e5d0078SDavid du Colombier v->type = "turgid";
13093e5d0078SDavid du Colombier if (prob(T * 1.5)) {
13103e5d0078SDavid du Colombier v->list.x[i++] = lconjadv();
13113e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13123e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13133e5d0078SDavid du Colombier } else if (prob(2 * T)) {
13143e5d0078SDavid du Colombier v->list.x[i++] = turgid(env);
13153e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13163e5d0078SDavid du Colombier v->list.x[i++] = conj();
13173e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13183e5d0078SDavid du Colombier } else if (prob(1.5 * T)) {
13193e5d0078SDavid du Colombier v->list.x[i++] = lconjsub();
13203e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13213e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13223e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13233e5d0078SDavid du Colombier } else if (prob(T * .5)) {
13243e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13253e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13263e5d0078SDavid du Colombier v->list.x[i++] = conjadv();
13273e5d0078SDavid du Colombier } else if (prob(T)) {
13283e5d0078SDavid du Colombier v->list.x[i++] = turgid(env);
13293e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13303e5d0078SDavid du Colombier v->list.x[i++] = conjsub();
13313e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13323e5d0078SDavid du Colombier } else if (prob(.5 * T)) {
13333e5d0078SDavid du Colombier v->list.x[i++] = nomz();
13343e5d0078SDavid du Colombier if (eqn && prob(.5)) {
13353e5d0078SDavid du Colombier v->list.x[i++] = equation();
13363e5d0078SDavid du Colombier v->list.x[i++] = comma(env);
13373e5d0078SDavid du Colombier v->list.x[i++] = conj();
13383e5d0078SDavid du Colombier }
13393e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13403e5d0078SDavid du Colombier } else
13413e5d0078SDavid du Colombier v->list.x[i++] = sent(env);
13423e5d0078SDavid du Colombier USED(i);
13433e5d0078SDavid du Colombier return v;
13443e5d0078SDavid du Colombier }
13453e5d0078SDavid du Colombier
13463e5d0078SDavid du Colombier char *
splitup(char * strlab)13473e5d0078SDavid du Colombier splitup(char *strlab) {
13483e5d0078SDavid du Colombier static char label[64];
13493e5d0078SDavid du Colombier int j, c;
13503e5d0078SDavid du Colombier
13513e5d0078SDavid du Colombier label[0]='"';
13523e5d0078SDavid du Colombier for (j=1; j<60 &&
13533e5d0078SDavid du Colombier (c = *strlab++) != '\0'; j++)
13543e5d0078SDavid du Colombier if (c == ' ') {
13553e5d0078SDavid du Colombier label[j++]='"';
13563e5d0078SDavid du Colombier label[j++]=' ';
13573e5d0078SDavid du Colombier label[j]='"';
13583e5d0078SDavid du Colombier }
13593e5d0078SDavid du Colombier else
13603e5d0078SDavid du Colombier label[j] = c;
13613e5d0078SDavid du Colombier label[j++] = '"'; label[j] = '\0';
13623e5d0078SDavid du Colombier return(label);
13633e5d0078SDavid du Colombier }
13643e5d0078SDavid du Colombier
13653e5d0078SDavid du Colombier void
abo(void)13663e5d0078SDavid du Colombier abo(void) {
1367*27d75179SDavid du Colombier fprint(2, "usage: festoon [-pet] [-sSEED] [SENTENCES] [%%-invented-nouns]\n");
13683e5d0078SDavid du Colombier exits("usage");
13693e5d0078SDavid du Colombier }
13703e5d0078SDavid du Colombier
13713e5d0078SDavid du Colombier void
caps(void)13723e5d0078SDavid du Colombier caps(void) {
13733e5d0078SDavid du Colombier int i;
13743e5d0078SDavid du Colombier for (i = 1; i < io; i++)
13753e5d0078SDavid du Colombier if (buff[i - 1] == ' ' && buff[i] <= 'z' && buff[i] >= 'a')
13763e5d0078SDavid du Colombier buff[i] += 'A' - 'a';
13773e5d0078SDavid du Colombier }
13783e5d0078SDavid du Colombier
13793e5d0078SDavid du Colombier void
main(int argc,char * argv[])13803e5d0078SDavid du Colombier main(int argc, char *argv[]) {
13813e5d0078SDavid du Colombier static char *furniture[] = {"WASTEBASKET", "ASHTRAY", "TABLE",
13823e5d0078SDavid du Colombier "DESK DRAWER", "COAT LOCKER", "BOOKSHELF"};
13833e5d0078SDavid du Colombier
13843e5d0078SDavid du Colombier static char *ccto[] = {
13853e5d0078SDavid du Colombier "J. N. Akkerhuis",
13863e5d0078SDavid du Colombier "J. J. Argosy",
13873e5d0078SDavid du Colombier "M. D. Banal",
13883e5d0078SDavid du Colombier "H. V. Bandersnatch",
13893e5d0078SDavid du Colombier "L. Bimmler",
13903e5d0078SDavid du Colombier "F. W. Blivet",
13913e5d0078SDavid du Colombier "Z. Brazen",
13923e5d0078SDavid du Colombier "M. Bushido",
13933e5d0078SDavid du Colombier "J. D. Carbuncle",
13943e5d0078SDavid du Colombier "N. Crab",
13953e5d0078SDavid du Colombier "R. H. deTruckle",
13963e5d0078SDavid du Colombier "R. L. Drechsler",
13973e5d0078SDavid du Colombier "C. B. Dudgeon",
13983e5d0078SDavid du Colombier "R. T. Dun",
13993e5d0078SDavid du Colombier "G. R. Emlin",
14003e5d0078SDavid du Colombier "W. G. Fallow",
14013e5d0078SDavid du Colombier "R. S. Flummox",
14023e5d0078SDavid du Colombier "R. N. Fribble",
14033e5d0078SDavid du Colombier "C. R. Glitch",
14043e5d0078SDavid du Colombier "R. H. Hardin",
14053e5d0078SDavid du Colombier "S. A. Hobble",
14063e5d0078SDavid du Colombier "B. W. Kernighan",
14073e5d0078SDavid du Colombier "D. B. Knudsen",
14083e5d0078SDavid du Colombier "C. L'Hommedieu",
14093e5d0078SDavid du Colombier "R. S. Limn",
14103e5d0078SDavid du Colombier "S. T. Livid",
14113e5d0078SDavid du Colombier "Mrs. B. R. Mauve",
14123e5d0078SDavid du Colombier "C. Mee",
14133e5d0078SDavid du Colombier "N-P. Nelson",
14143e5d0078SDavid du Colombier "C. H. Russet",
14153e5d0078SDavid du Colombier "M. Shayegan",
14163e5d0078SDavid du Colombier "M. H. Simper",
14173e5d0078SDavid du Colombier "B. R. Sorrel",
14183e5d0078SDavid du Colombier "G. Swale",
14193e5d0078SDavid du Colombier "R. R. Swarthy",
14203e5d0078SDavid du Colombier "P. Terra-Cotta",
14213e5d0078SDavid du Colombier "U. G. Winnow"};
14223e5d0078SDavid du Colombier
14233e5d0078SDavid du Colombier static char *picelem[] = { "box", "ellipse", "box", "box"};
14243e5d0078SDavid du Colombier static char *piccon[] = { "arrow", "line", "line <-", "line <->",
14253e5d0078SDavid du Colombier "spline", "spline <-", "spline <->"};
14263e5d0078SDavid du Colombier static char *picdir[] = { "right", "down right", "down",
1427*27d75179SDavid du Colombier "left", "up left", "left", "down", "down right", nil};
14283e5d0078SDavid du Colombier E env;
14293e5d0078SDavid du Colombier X tree;
14303e5d0078SDavid du Colombier int i, j = 0, k = 0;
14313e5d0078SDavid du Colombier int lim = 0;
14323e5d0078SDavid du Colombier long t = 0;
14333e5d0078SDavid du Colombier char c, **str;
14343e5d0078SDavid du Colombier int junk, junk2;
14353e5d0078SDavid du Colombier
14363e5d0078SDavid du Colombier for (i = 1, ++argv; i < argc; i++, argv++)
14373e5d0078SDavid du Colombier if (*argv[0] == '-') /* -pet -snnn */
14383e5d0078SDavid du Colombier while (c = *++argv[0])
14393e5d0078SDavid du Colombier switch (c) {
14403e5d0078SDavid du Colombier case 'z':
14413e5d0078SDavid du Colombier flag = 1;
14423e5d0078SDavid du Colombier continue;
14433e5d0078SDavid du Colombier case 'p':
14443e5d0078SDavid du Colombier pic = 1;
14453e5d0078SDavid du Colombier continue;
14463e5d0078SDavid du Colombier case 't':
14473e5d0078SDavid du Colombier tbl = 1;
14483e5d0078SDavid du Colombier continue;
14493e5d0078SDavid du Colombier case 'e':
14503e5d0078SDavid du Colombier eqn = 1;
14513e5d0078SDavid du Colombier continue;
14523e5d0078SDavid du Colombier case 's':
14533e5d0078SDavid du Colombier t = atoi(argv[0]+1); argv[0][1] = '\0';
14543e5d0078SDavid du Colombier continue;
14553e5d0078SDavid du Colombier default:
14563e5d0078SDavid du Colombier abo(); /* illegal option */
14573e5d0078SDavid du Colombier }
14583e5d0078SDavid du Colombier else if (lim == 0)
14593e5d0078SDavid du Colombier lim = atoi(argv[0]);
14603e5d0078SDavid du Colombier else
14613e5d0078SDavid du Colombier makeup = 1.0 - (float) atoi(argv[0]) / 100.0;
14623e5d0078SDavid du Colombier USED(i);
14633e5d0078SDavid du Colombier if (t == 0)
14643e5d0078SDavid du Colombier time(&t);
14653e5d0078SDavid du Colombier if (makeup < 0. || makeup > 1.0)
14663e5d0078SDavid du Colombier makeup = 1.0;
14673e5d0078SDavid du Colombier if (lim <= 0)
14683e5d0078SDavid du Colombier lim = 25;
14693e5d0078SDavid du Colombier srand((int) t);
14703e5d0078SDavid du Colombier
1471*27d75179SDavid du Colombier print(".TL\n");
14723e5d0078SDavid du Colombier env = getenvq();
14733e5d0078SDavid du Colombier tree = np(env);
14743e5d0078SDavid du Colombier io = 0;
14753e5d0078SDavid du Colombier pr(tree);
14763e5d0078SDavid du Colombier buff[io] = 0;
14773e5d0078SDavid du Colombier caps();
1478*27d75179SDavid du Colombier print("%s\n", buff);
1479*27d75179SDavid du Colombier print(".AU \"C. C. Festoon\" CCF Headquarters %ld\n", t);
14803e5d0078SDavid du Colombier if (eqn)
1481*27d75179SDavid du Colombier print(".EQ\ndelim $$\n.EN\n");
1482*27d75179SDavid du Colombier print(".AS\n");
14833e5d0078SDavid du Colombier free(env);
14843e5d0078SDavid du Colombier do {
14853e5d0078SDavid du Colombier env = getenvq();
14863e5d0078SDavid du Colombier tree = turgid(env);
14873e5d0078SDavid du Colombier io = 0;
14883e5d0078SDavid du Colombier pr(tree);
14893e5d0078SDavid du Colombier buff[io] = 0;
1490*27d75179SDavid du Colombier print("%s.\n", buff);
14913e5d0078SDavid du Colombier free(env);
14923e5d0078SDavid du Colombier } while (prob(0.75));
1493*27d75179SDavid du Colombier print(".AE\n");
1494*27d75179SDavid du Colombier print(".MT \"MEMORANDUM FOR %s\"\n.hy 1\n",
14953e5d0078SDavid du Colombier CHOOSE(furniture));
14963e5d0078SDavid du Colombier while (i++ < lim) {
14973e5d0078SDavid du Colombier if (i % 23 == 0) { /* Time for a section header */
14983e5d0078SDavid du Colombier env = getenvq();
14993e5d0078SDavid du Colombier tree = np(env);
15003e5d0078SDavid du Colombier io = 0;
1501*27d75179SDavid du Colombier print(".H 1 \"");
15023e5d0078SDavid du Colombier pr(tree);
15033e5d0078SDavid du Colombier buff[io] = 0;
15043e5d0078SDavid du Colombier caps();
1505*27d75179SDavid du Colombier print("%s\"\n", buff);
15063e5d0078SDavid du Colombier free(env);
15073e5d0078SDavid du Colombier }
15083e5d0078SDavid du Colombier if (i % 27 == 0 && pic) { /* Time for a picture */
1509*27d75179SDavid du Colombier print(".DS CB\n.ps -1\n.PS\n");
15103e5d0078SDavid du Colombier str = &(CHOOSE(picdir));
1511*27d75179SDavid du Colombier if (*str == nil) str = &picdir[0];
15123e5d0078SDavid du Colombier junk2 = (R&07) + 3;
15133e5d0078SDavid du Colombier for(junk = 1; junk < junk2; junk++) {
1514*27d75179SDavid du Colombier print("%s; ", *str);
15153e5d0078SDavid du Colombier if (str == &picdir[0]) {
1516*27d75179SDavid du Colombier pic = 2; print("A: ");
15173e5d0078SDavid du Colombier }
1518*27d75179SDavid du Colombier print("%s %s ht %3.1f wid %3.1f\n",
15193e5d0078SDavid du Colombier CHOOSE(picelem), splitup(CHOOSE(nounlist)),
15203e5d0078SDavid du Colombier 0.4+0.5/junk2, 0.8+0.6/junk2);
1521*27d75179SDavid du Colombier print("%s %s %3.1f ",
15223e5d0078SDavid du Colombier CHOOSE(piccon), *str, 0.2+.3/junk2);
1523*27d75179SDavid du Colombier if (*++str == nil) str = &picdir[0];
1524*27d75179SDavid du Colombier print("then %s %3.1f %s\n",
15253e5d0078SDavid du Colombier *str, 0.3+.2/junk2,
15263e5d0078SDavid du Colombier splitup(CHOOSE(adjlist)));
15273e5d0078SDavid du Colombier }
1528*27d75179SDavid du Colombier print("circle rad .3 \"process\" \"completion\"\n");
15293e5d0078SDavid du Colombier if (pic == 2) {
15303e5d0078SDavid du Colombier pic =1;
1531*27d75179SDavid du Colombier print("line <- dashed up .25 from A.n\n");
1532*27d75179SDavid du Colombier print("circle rad .3 \"process\" \"start\"\n");
15333e5d0078SDavid du Colombier }
1534*27d75179SDavid du Colombier print(".PE\n.ps +1\n.DE\n");
1535*27d75179SDavid du Colombier print(".ce\n\\fBFigure %d\\fP\n", i/27);
15363e5d0078SDavid du Colombier }
15373e5d0078SDavid du Colombier if (i % 41 == 0 && tbl) { /* Time for a table */
1538*27d75179SDavid du Colombier print(".TS\n");
1539*27d75179SDavid du Colombier print("box, center;\nc\ts\ts\n");
1540*27d75179SDavid du Colombier print("n | l | lw(%3.1fi).\n", 2.0+(41.0+(t&07))/i);
1541*27d75179SDavid du Colombier print("Action Plan %d\n=\n", i);
1542*27d75179SDavid du Colombier print("Item\tWho\tAction\n");
15433e5d0078SDavid du Colombier for (junk = 1; junk < (i&17)+4; junk++) {
1544*27d75179SDavid du Colombier print("_\n%ld\t", t/i+junk);
1545*27d75179SDavid du Colombier print("%s\tT{\n", CHOOSE(ccto));
15463e5d0078SDavid du Colombier env = getenvq();
15473e5d0078SDavid du Colombier io = 0;
15483e5d0078SDavid du Colombier tree = sent(env);
15493e5d0078SDavid du Colombier pr(tree);
15503e5d0078SDavid du Colombier buff[io] = 0;
1551*27d75179SDavid du Colombier print("%s.\nT}\n", buff);
15523e5d0078SDavid du Colombier free(env);
15533e5d0078SDavid du Colombier }
1554*27d75179SDavid du Colombier print(".TE\n");
1555*27d75179SDavid du Colombier print(".ce\n\\fBTable %d\\fP\n", i/41);
15563e5d0078SDavid du Colombier }
15573e5d0078SDavid du Colombier env = getenvq();
15583e5d0078SDavid du Colombier tree = turgid(env);
15593e5d0078SDavid du Colombier io = 0;
15603e5d0078SDavid du Colombier pr(tree);
15613e5d0078SDavid du Colombier buff[io] = 0;
15623e5d0078SDavid du Colombier if (++k % 13 == 0 && prob(0.35)) { /* Bullet list */
1563*27d75179SDavid du Colombier print("%s:\n", buff);
1564*27d75179SDavid du Colombier print(".BL\n");
15653e5d0078SDavid du Colombier do {
1566*27d75179SDavid du Colombier print(".LI\n");
15673e5d0078SDavid du Colombier free(env);
15683e5d0078SDavid du Colombier env = getenvq();
15693e5d0078SDavid du Colombier io = 0;
15703e5d0078SDavid du Colombier tree = sent(env);
15713e5d0078SDavid du Colombier pr(tree);
15723e5d0078SDavid du Colombier buff[io] = 0;
1573*27d75179SDavid du Colombier print("%s.\n", buff);
15743e5d0078SDavid du Colombier } while (prob(.83));
1575*27d75179SDavid du Colombier print(".LE\n");
1576*27d75179SDavid du Colombier print(".P\n");
15773e5d0078SDavid du Colombier } else {
15783e5d0078SDavid du Colombier if (k % 11 == 0 && prob(.21)) { /* do as footnote */
1579*27d75179SDavid du Colombier print("%s\\*F.\n", buff);
15803e5d0078SDavid du Colombier free(env);
15813e5d0078SDavid du Colombier env = getenvq();
15823e5d0078SDavid du Colombier io = 0;
15833e5d0078SDavid du Colombier tree = sent(env);
15843e5d0078SDavid du Colombier pr(tree);
15853e5d0078SDavid du Colombier buff[io] = 0;
1586*27d75179SDavid du Colombier print(".FS\n%s.\n.FE\n", buff);
15873e5d0078SDavid du Colombier }
1588*27d75179SDavid du Colombier else print("%s.\n", buff); /* normal flush */
15893e5d0078SDavid du Colombier }
15903e5d0078SDavid du Colombier if (++j > 2 && prob(0.4))
1591*27d75179SDavid du Colombier print(".P\n"), j = 0;
15923e5d0078SDavid du Colombier free(env);
15933e5d0078SDavid du Colombier }
15943e5d0078SDavid du Colombier USED(i);
1595*27d75179SDavid du Colombier print(".SG\n");
1596*27d75179SDavid du Colombier print(".NS 0\n");
15973e5d0078SDavid du Colombier for (j = 0; j == 0;) {
15983e5d0078SDavid du Colombier for (i = 0; i < sizeof ccto / sizeof *ccto; i++) {
15993e5d0078SDavid du Colombier if (prob(.10))
1600*27d75179SDavid du Colombier j = 1, print("%s\n", ccto[i]);
16013e5d0078SDavid du Colombier }
16023e5d0078SDavid du Colombier }
1603*27d75179SDavid du Colombier print(".NE\n");
16043e5d0078SDavid du Colombier USED(i);
16053e5d0078SDavid du Colombier exits("");
16063e5d0078SDavid du Colombier }
16073e5d0078SDavid du Colombier
16083e5d0078SDavid du Colombier void
pr(tree)16093e5d0078SDavid du Colombier pr(tree)
16103e5d0078SDavid du Colombier X tree;
16113e5d0078SDavid du Colombier {
16123e5d0078SDavid du Colombier int i;
16133e5d0078SDavid du Colombier if (flag ) {
16143e5d0078SDavid du Colombier out("<");
16153e5d0078SDavid du Colombier out(tree->type);
16163e5d0078SDavid du Colombier out(">");
16173e5d0078SDavid du Colombier }
16183e5d0078SDavid du Colombier if (tree->type[0] == '-') {
16193e5d0078SDavid du Colombier out(" ");
16203e5d0078SDavid du Colombier for (i = 0; tree->list.s[i]; i++) {
16213e5d0078SDavid du Colombier out(tree->list.s[i]);
16223e5d0078SDavid du Colombier }
16233e5d0078SDavid du Colombier } else
16243e5d0078SDavid du Colombier for (i = 0; tree->list.x[i]; i++) {
16253e5d0078SDavid du Colombier pr(tree->list.x[i]);
16263e5d0078SDavid du Colombier }
16273e5d0078SDavid du Colombier free(tree);
16283e5d0078SDavid du Colombier USED(i);
16293e5d0078SDavid du Colombier return;
16303e5d0078SDavid du Colombier }
16313e5d0078SDavid du Colombier
16323e5d0078SDavid du Colombier void
out(s)16333e5d0078SDavid du Colombier out(s)
16343e5d0078SDavid du Colombier char *s;
16353e5d0078SDavid du Colombier {
16363e5d0078SDavid du Colombier if (io == 0 && *s == ' ')
16373e5d0078SDavid du Colombier return;
16383e5d0078SDavid du Colombier if (io == 0) {
16393e5d0078SDavid du Colombier for (; s[io]; io++)
16403e5d0078SDavid du Colombier buff[io] = s[io];
16413e5d0078SDavid du Colombier buff[0] += 'A' - 'a';
16423e5d0078SDavid du Colombier return;
16433e5d0078SDavid du Colombier }
16443e5d0078SDavid du Colombier if ((buff[io - 1] == ' ' || buff[io - 1] == '\n' ) && *s == ' ')
16453e5d0078SDavid du Colombier return;
16463e5d0078SDavid du Colombier if (buff[io - 1] == ' ' && *s == ',') {
16473e5d0078SDavid du Colombier buff[io - 1] = ',';
16483e5d0078SDavid du Colombier buff[io++] = '\n';
16493e5d0078SDavid du Colombier return;
16503e5d0078SDavid du Colombier }
16513e5d0078SDavid du Colombier if (buff[io - 1] == 'y' && *s == 'i' && s[1] == 'e')
16523e5d0078SDavid du Colombier io--;
16533e5d0078SDavid du Colombier else if (*s == buff[io - 1] && *s != 's' && *s != 'n')
16543e5d0078SDavid du Colombier io--;
16553e5d0078SDavid du Colombier else if (*s == 'e' && buff[io - 1] == 'a')
16563e5d0078SDavid du Colombier io--;
16573e5d0078SDavid du Colombier for (; *s;)
16583e5d0078SDavid du Colombier buff[io++] = *s++;
16593e5d0078SDavid du Colombier return;
16603e5d0078SDavid du Colombier }
1661