/*	Copyright (c) 1984 AT&T	*/
/*	  All Rights Reserved  	*/

/*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*/
/*	The copyright notice above does not evidence any   	*/
/*	actual or intended publication of such source code.	*/

/*
#ident	"@(#)subndx:pscan.c	1.3"
*/
#include <stdio.h>
#include "names.h"
#include "conp.h"
#define isadv(c)	(c == ADV || c == ADJ_ADV)
#define isadj(c)	(c == ADJ || c == NOUN_ADJ || c == ADJ_ADV || c == UNK)
#define notnoun(c)	(c != NOUN && c != UNK && c != NOUN_VERB && c != NV_PL && c != PNOUN)
#define issing(c)	(c == UNK || c == NOUN_VERB || c == NOUN || c == NOM || c == NOUN_ADJ)
#define isnoun(c)	(c == NOUN || c == NOUN_VERB || c == NV_PL || c == UNK || c == PNOUN)
#define nounnom(c)	(c == NOUN || c == NOM)

void getv2(char ce);

char	lastc, nextc;
int	savsub;
scan(si, ce, command)	/*scan a phrase */
int	si;
char	ce;
{
	int	savi;
	char	c;
	i = si;
	if (command == 1)
		subty = PLURAL;
	else 
		subty = 0;
	if (sent[i].cc == ADJ_ADV && sent[i+1].cc != NOUN && sent[i+1].cc != UNK
	     && sent[i+1].cc != ADJ && sent[i+1].cc != NOUN_ADJ)
		sent[i++].cc = ADV;
	done = 0;
	verb = 0;
	verb = getv(i, ce);	/*get verb if obvious*/
	if (command == 0)
		j = getnoun(i, ce);		/*get subject*/
	else 
		j = si;
	if (i != j || ((i == j) && sent[i].cc == NOUN)) {
		i = j + 1;
	}
	for (; ((c = sent[i].cc) != ce) && (c != END)  && (c != '\0'); i++) {
		nextc = sent[i+1].cc;
		if (i > 0) {
			lastc = sent[i-1].cc;
			if (lastc == BE)
				be = 1;
			else {
				if (lastc != ADV)
					be = 0;
			}
		} else 
			lastc = 0;
		if (verb == 1)
			question = 0;
		switch (c) {
		case '"':
			if (nextc == ED || nextc == MVERB) {
				verb = 1;
				sent[++i].cc = VERB;
				subty = SING;
				continue;
			}
			subty = 0;
			verb = getv(++i, ce);
			i = getnoun(i, ce);
			continue;
		case MVERB:
			sent[i].cc = VERB;
			if (i < nsleng * .5) {
				verb = getv(++i, ce);
				i = getnoun(i, ce);
				continue;
			}
			continue;
		case ART:
		case ADJ:
		case POS:
		case ING:
			aflg = 1;
			i = getnoun(i, ce);
			aflg = 0;
			continue;
		case PREP:
			if (nextc == ce) {
				sent[i].cc = ADV;
				goto sdone;
			}
			prep = 1;
			i = getnoun(++i, ce);
			prep = 0;
			continue;
		case VERB_ADJ:
			if (verb == 0) {
				sent[i].cc = VERB;
				verb = 1;
				continue;
			}
		case NOUN_ADJ:
			if (be == 1) {
				sent[i].cc = ADJ;
				continue;
			}
		case PRONP_ADJ:
		case PRONS_ADJ:
			i = getnoun(i, ce);
			continue;
		case NOUN_ADV:
			if (verb == 1 && iverb == i + 1) {
				sent[i].cc = NOUN;
			} else {
				sent[i].cc = ADV;
			}
			continue;
		case ADJ_ADV:
			if (be == 1) {
				if (isadj(nextc)) {
					sent[i].cc = ADV;
					continue;
				}
				if (nextc == ',' && isadv(sent[i+2].cc)) {
					sent[i++].cc = ADV;
					sent[++i].cc = ADV;
					comma--;
					continue;
				}
				sent[i].cc = ADJ;
				continue;
			}
			if (lastc == NOUN && (nextc == ',' || nextc == END)) {
				sent[i].cc = ADJ;
				continue;
			}
			if (notnoun(nextc)) {
				sent[i].cc = ADV;
				continue;
			}
			sent[i].cc = ADJ;
			continue;
		case WHO:
			i = who(i, ce);
			continue;
		case PRONP:
			subty = PLURAL;
			continue;
		case NOUN:
			if (nextc == NOUN) {
				sent[i].cc = ADJ;
				continue;
			}
		case PRONS:
			subty = SING;
			continue;
		case PNOUN:
			sent[i].cc = NOUN;
			if (subty == 0)
				subty = PLURAL;
			continue;
		case CONJ:
			if (nextc == UNK || nextc == NOUN_VERB || nextc == NV_PL) {
				if (lastc == ADJ)
					sent[++i].cc = ADJ;
				else 
					sent[++i].cc = VERB;
			}
			if (nextc == ED) {
				sent[++i].cc = VERB;
			}
			continue;
		case AUXP:
		case AUXS:
		case BES:
		case BEP:
		case AUXV:
		case AUX:
		case HAS:
		case HAVE:
		case HAD:
			verb = getv(i, ce);
			continue;
		case ADV:
		case AUXX:
		case VERB:
		case BE:
		case INTER:
			continue;
		case THAT:
			if (nextc == SUBCONJ) {
				sent[i].cc = PRONP;
				goto subc;
			}
			verb = getv(i + 1, ce);
			j = i + 1;
			while (isadv(sent[j].cc)) {
				j++;
			}
			nextc = sent[j].cc;
			if ((verb == 1 && iverb == j) || nextc == ED || nextc == VERB_ADJ) {
				sent[i].cc = PRONP;
				while (i + 1 < j)
					sent[++i].cc = ADV;
			} else if (verb == 0 && nextc == NV_PL && ((lastc == NOUN
			     && issing(sent[i-1].ic)) || lastc == ',')) {
				sent[i].cc = PRONP;
				subty = SING;
				while (i + 1 < j)
					sent[++i].cc = ADV;
			} else if (verb == 0 && (nextc == UNK || nextc == NOUN_VERB) && (lastc == NOUN
			     && sent[i-1].ic == NV_PL)) {
				subty = PLURAL;
				sent[i].cc = PRONP;
				while (i + 1 < j)
					sent[++i].cc = ADV;
			} else {
				if (i == 0)
					sent[i].cc = ADJ;
				else 
					sent[i].cc = SUBCONJ;
				j = i;
				subty = 0;
				i = getnoun(i + 1, ce);
				if (done)
					sent[j].cc = ADJ;
			}
			continue;
		case ',':
			if (nextc != CONJ) {	/*parenthetical*/
				continue;
			}
			i++;
			comma--;
			if (sent[i+1].cc == ED || sent[i+1].cc == MVERB) {
				sent[++i].cc = VERB;
				continue;
			}
			if (command == 1) {
				verb = getv(++i, ce);
				continue;
			}
		case SUBCONJ:
subc:
			savi = i;
			if (nextc == END || (lastc == ',' && nextc == ',')) {
				sent[i].cc = ADV;
				continue;
			}
			subty = 0;
			ce = ',';
			verb = getv(++i, ce);
			if (sent[savi+1].cc == VERB || sent[savi+1].cc == AUXX)
				if (sent[savi].cc == SUBCONJ)
					sent[savi].cc = ADV;
			i = getnoun(i, ce);
			continue;
		case PREP_ADV:
			if (sent[i+2].cc == PREP_ADV && (sent[i+1].cc != NOUN && sent[i+1].cc != NOUN_VERB
			     && sent[i+1].cc != NV_PL && sent[i+1].cc != PNOUN)) {
				sent[i].cc = ADV;
				sent[i+2].cc = CONJ;
				continue;
			}
			sav = i++;
			savsub = subty;
			pverb = getv(i, ce);
			if ((pverb == 1 && iverb == i) || sent[i].cc == ED) {
				sent[sav].cc = PRONP;
				sent[i].cc = VERB;
				continue;
			}
			i = getnoun(i, ce);
			if (done == 1) {
				sent[sav].cc = ADV;
				goto sdone;
			}
			if (pverb == 1 && iverb == i + 1) {
				sent[sav].cc = SUBCONJ;
				ce = ',';
				continue;
			}
			switch (sent[i+1].cc) {
			case UNK:
			case NV_PL:
			case NOUN_VERB:
			case ED:
				sent[sav].cc = SUBCONJ;
				verb = 0;
				ce = ',';
				continue;
			default:
				sent[sav].cc = PREP;
				subty = savsub;
				continue;
			}
		case TO:
			savi = i;
			sent[i++].cc = VERB;
sw:
			switch (nextc) {
			case UNK:
			case AUXS:
			case VERB_ADJ:
			case NOUN_VERB:
			case VERB:
			case MVERB:
				sent[i].cc = VERB;
				continue;
			case HAVE:
				sent[i].cc = VERB;
				if (sent[i+1].cc == ED) {
					sent[++i].cc = VERB;
					continue;
				}
				if (sent[i+1].cc == ADV)
					i++;
				if (sent[i+1].cc != BE)
					continue;
				i++;
			case BE:
				sent[i].cc = VERB;
				if (sent[i+1].cc == ADV)
					i++;
				if (sent[i+1].cc == ED || sent[i+1].cc == ING) {
					sent[++i].cc = VERB;
				} else if (sent[i+1].cc == UNK) {
					sent[++i].cc = ADJ;
				}
				continue;
			case ADV:
				nextc = sent[++i].cc;
				goto sw;
			default:
				sent[savi].cc = PREP;
				prep = 1;
				i = getnoun(i, ce);
				prep = 0;
				continue;
			}
		case NV_PL:
			if (subty == 0) {
				i = getnoun(i, ce);
				subty = PLURAL;
			} else if (verb == 0) {	/*need verb*/
				sent[i].cc = VERB;
				verb = 1;
			} else {
				i = getnoun(i, ce);
			}
			continue;
		case UNK:
		case NOUN_VERB:
			if (verb == 1) {
				if (be == 1 && nextc != WHO) {
					sent[i].cc = ADJ;
					continue;
				}
				i = getnoun(i, ce);
			} else if (nextc == NV_PL && isnoun(sent[i+2].cc)) {
				sent[i].cc = NOUN;
				if (sent[i-1].cc == NOUN) {
					sent[i-1].cc = ADJ;
				}
				subty = SING;
				continue;
			} else if (subty == 0) {
				i = getnoun(i, ce);
				continue;
			} else {		/* desparation */
				sent[i].cc = VERB;
				verb = 1;
			}
			continue;
		case ED:
			if (verb == 0) {
				sent[i].cc = VERB;
				verb = 1;
			} else if (sent[i-1].cc == BE) {
				sent[i].cc = VERB;
			} else {
				i = getnoun(i, ce);
			}
			continue;
		default:	
			printf("got a %c %o on %sat %d\n", sent[i].cc, sent[i].cc, sent[i].sp, i);
		}
	}
sdone:
	if (sent[i].cc == END && sent[i].ic != ';')
		return(-1);
	else {
		if (sent[i].ic == ';')
			sent[i].cc = ';';
		else 
			comma--;
		return(i);
	}
}


getv(si, ce)
int	si;
char	ce;
{
	int	conj;
	char	c;
	int	ik;
	must = 0;
	bflg = 0;
	hflg = 0;
	verbty = 0;
	for (j = si; ((c = sent[j].cc) != ce) && (c != END); j++) {
		iverb = j;
		switch (c) {
		case ED:
			continue;
		case HAS:
			hflg = 1;
			verbty = SING;
			sent[j].cc = AUXX;
			goto next;
		case HAVE:
			if (sent[j-1].cc == TO) {
				continue;
			}
		case HAD:
			hflg = 1;
			verbty = PLURAL;
			sent[j].cc = AUXX;
			goto next;
		case BE:
			if (sent[j].ic != BE) {
				return(1);
			}
			continue;
		case VERB:
			if (sent[j-1].cc == TO) {
				continue;
			}
			return(1);
		case AUXX:
			return(1);
		case AUXP:
			must = 1;
			verbty = PLURAL;
			sent[j].cc = AUXX;
			goto next;
		case AUXS:
			if (sent[j-1].cc == TO) {
				continue;
			}
			verbty = SING;
			sent[j].cc = AUXX;
			goto next;
		case AUX:
		case AUXV:
			must = 1;
			sent[j].cc = AUXX;
next:
			if (sent[j-1].cc == CONJ && verb == 0)
				conj = 0;
			else 
				conj = 1;
			if (question == 1) {
				j = getnoun(j + 1, ce);
				question = 0;
			}
			getv2(ce);
			if (sent[j].cc == AUXX) {
				sent[j].cc = VERB;
			}
			if ((sent[j].cc != VERB && sent[j].cc != BE) && sent[iverb].cc == AUXX) {
				sent[iverb].cc = VERB;
				for (ik = iverb + 1; ik <= j; ik++) {
					if (sent[ik].ic == NOM)
						sent[ik].cc = NOUN;
					else 
						sent[ik].cc = sent[ik].ic;
				}
			}
			return(conj);
		case BES:
			verbty = SING;
			bflg = 1;
			sent[j].cc = BE;
			goto next;
		case BEP:
			verbty = PLURAL;
			bflg = 1;
			sent[j].cc = BE;
			goto next;
		case SUBCONJ:
			if (sent[j-1].cc == ',' && sent[j+1].cc == ',') {
				continue;
			}
		case THAT:
		case WHO:
			goto vdone;
		case ',':	
			if (comma == 1 && sent[j+1].cc == CONJ) {
				goto vdone;
			}
		}
	}
vdone:
	return(0);
}

void
getv2(ce)
char	ce;
{
	int	vflg;
	char	c;
	vflg = 0;
	while (((c = sent[++j].cc) != ce) && (c != END)) {
		switch (c) {
		case NOUN_ADV:
		case ADJ_ADV:
			if (bflg == 0 || sent[j+1].cc == ED || sent[j+1].cc == ING) {
				sent[j].cc = ADV;
			} else {
				j -= 1;
				return;
			}
		case ADV:
			continue;
		case SUBCONJ:
			if (sent[j+1].cc == ED || sent[j+1].cc == ING || sent[j+1].cc == ADV || 
			    sent[j+1].cc == ADJ_ADV)
				sent[j].cc = ADV;
			else 
				return;
			continue;
		case VERB:
			return;
		case VERB_ADJ:
		case ED:
			sent[j].cc = VERB;
			return;
		case BE:
			must = 0;
			bflg = 1;
			continue;
		case ING:
			if (bflg == 1) {
				sent[j].cc = VERB;
			} else {
				j -= 1;
			}
			return;
		case NOUN_VERB:
		case UNK:
			if (bflg == 1 || vflg == 1 || hflg == 1) {
				j -= 1;
				return;
			}
			sent[j].cc = VERB;
			return;
		case PRONP_ADJ:
		case PRONS_ADJ:
			c = sent[j+1].cc;
			if (c == ED || c == ING || c == BE || must == 1) {
				sent[j].cc = ADV;
			} else {
				j -= 1;
				return;
			}
			continue;
		case AUXV:
		case AUX:
		case AUXP:
		case AUXS:
		case HAD:
		case HAVE:
		case HAS:
			must = 0;
			vflg = 1;
			sent[j].cc = AUXX;
			continue;
		default:
			j -= 1;
			return;
		}
	}
	j -= 1;
}


getnoun(k, ce)
int	k, ce;
{
	char	c;
	int	st, t, nextst;
	int	rep;
	int	t1, tt;
	st = k;
	rep = 0;
b:
	nextst = sent[st+1].cc;
	switch (sent[st].cc) {
	case END:
		done = 1;
		break;
	case ',':
		if (ce == ',') {
			done = 1;
			break;
		} else {
			goto getdef;
		}
	case '"':
		if (aflg == 1) {
			st++;
			goto b;
		}
		break;
	case NOUN:
		switch (nextst) {
		case UNK:
		case NOUN_VERB:
			if (verb == 1) {
				goto nn;
			}
			if (subty != PLURAL) {
				goto nn;
			}
			break;
		case NV_PL:
			if (verb == 1) {
				goto nn;
			}
			if (subty == PLURAL) {
				goto nn;
			}
			break;
		case PNOUN:
		case NOUN_ADJ:
		case POS:
		case NOUN:
nn:
			sent[st].cc = ADJ;
			goto b;
		}
		if (prep == 0)
			subty = SING;
		break;
	case PNOUN:
		sent[st].cc = NOUN;
		if (prep == 0)
			subty = PLURAL;
		break;
	case ADV:
		st++;
		goto b;
	case WHO:
		st = who(st, ce);
		st++;
		goto b;
	case ADJ_ADV:
	case VERB_ADJ:
	case ED:
		sent[st++].cc = ADJ;
		goto b;
	case ING:
		if (isnoun(nextst)) {
			sent[st++].cc = ADJ;
			goto b;
		}
		sent[st].cc = NOUN;
		if (prep == 0)
			subty = SING;
		break;
	case ART:
	case POS:
		if (st != k) {
			goto getdef;
		}
	case ADJ:
		st++;
		goto b;
	case PRONP:
		if (prep == 0)
			subty = PLURAL;

		break;
	case PRONS:
		if (prep == 0)
			subty = SING;
		break;
	case NOUN_VERB:
		if ((nextst == NOUN || nextst == PNOUN) || (verb == 1 && (nextst == NV_PL || nextst == NOUN_VERB) )) {
			sent[st].cc = ADJ;
			goto b;
		}
	case NV_PL:
		sent[st].cc = NOUN;
		if (prep == 0) {
			if (sent[st].ic == NV_PL)
				subty = PLURAL;
			else 
				subty = SING;
		}
		if (sent[st-1].cc == NOUN && nounnom(sent[st-1].ic)) {
			sent[st-1].cc = ADJ;
		}
		break;
	case PRONP_ADJ:
		switch (nextst) {
		case PNOUN:
		case NOUN_ADJ:
		case NV_PL:
		case ADJ_ADV:
		case PRONS_ADJ:
		case ADJ:
		case ING:
			sent[st++].cc = ADJ;
			goto b;
		case NOUN_VERB:
		case UNK:
		case ED:
			if (verb == 0) {
				goto def;
			} else {
				sent[st++].cc = ADJ;
				goto b;
			}
		case NOUN:
			sent[st++].cc = ADJ;
			if (prep == 0)
				subty = SING;
			break;
		case SUBCONJ:	
			sent[st++].cc = PRONP;	/* more than .. */
			sent[st++].cc = CONJ;
			if (verb == 0)
				verb = getv(st, ce);
			goto b;
		case '"':
			sent[st++].cc = ADJ;
			st++;
			goto b;
		default:
def:
			sent[st].cc = PRONP;
			if (prep == 0)
				subty = PLURAL;

			break;
		}
		break;
	case PRONS_ADJ:
		if (aflg == 1 && nextst != END && nextst != ART) {
			sent[st++].cc = ADJ;
			goto b;
		}
		switch (nextst) {
		case '"':
			sent[st++].cc = ADJ;
			st++;
			goto b;
		case PNOUN:
		case ING:
		case UNK:
		case NOUN_VERB:
		case NOUN_ADJ:
		case ADJ_ADV:
		case ADJ:
			sent[st++].cc = ADJ;
			goto b;
		case NOUN:
			sent[st++].cc = ADJ;
			if (prep == 0)
				subty = SING;
			break;
		case PRONS_ADJ:
			sent[st++].cc = ADJ;
			sent[st].cc = PRONP;
			if (prep == 0)
				subty = SING;
			break;
		case NV_PL:
			if (verb == 1) {
				sent[st++].cc = ADJ;
				sent[st].cc = NOUN;
				if (prep == 0)
					subty = PLURAL;

				break;
			}
			sent[st].cc = PRONP;
			if (prep == 0)
				subty = SING;
			break;
		default:
			sent[st].cc = PRONP;
			if (prep == 0)
				subty = SING;

			break;
		}
		break;
	case NOUN_ADJ:
		if (nextst == NOUN || nextst == ADJ || nextst == NOUN_ADJ || nextst == PRONS_ADJ || nextst == PRONP_ADJ ||
		    nextst == PNOUN) {
			sent[st++].cc = ADJ;
			goto b;
		}
		if (nextst != UNK && nextst != NOUN_VERB && nextst != NV_PL) {
			sent[st].cc = NOUN;
			if (prep == 0)
				subty = SING;
			break;
		}
		if (verb == 1 || sent[st+2].cc == ED) {
			sent[st++].cc = ADJ;
			goto b;
		}
		sent[st].cc = NOUN;
		if (prep == 0)
			subty = SING;
		break;
	case UNK:
		if (nextst != UNK) {
			if (nextst == ',' && rep == 0) {
				c = sent[st+2].cc;
				if ((c == UNK || c == ADJ || c == NOUN_ADJ || c == ING) && isnoun(sent[st+3].cc)) {
					comma--;
					sent[st].cc = ADJ;
					sent[st+2].cc = ADJ;
					sent[st+3].cc = NOUN;
					if (prep == 0) {
						if (sent[st+3].ic == NV_PL)
							subty = PLURAL;
						else 
							subty = SING;
					}
					return(st + 3);
				} else {
					sent[st].cc = NOUN;
					if (prep == 0)
						subty = SING;
					break;
				}
			}
			if (nextst == NOUN || nextst == ING || nextst == NOUN_ADJ || sent[st-1].cc == ADV
			     || nextst == ADJ || nextst == PNOUN) {
				sent[st++].cc = ADJ;
				goto b;
			}
			if ((nextst == NV_PL || nextst == NOUN_VERB) && (verb == 1 || (verb == 0 && (sent[st+2].cc == UNK
			     || sent[st+2].cc == NOUN_VERB || sent[st+2].cc == ED || sent[st+2].cc == VERB_ADJ)))) {
				sent[st++].cc = ADJ;
				sent[st].cc = NOUN;
				if (prep == 0)
					subty = PLURAL;
				break;
			}
			if (nextst == CONJ && isadv(sent[st+2].cc)) {
				sent[st].cc = ADJ;
				goto b;
			}
			sent[st].cc = NOUN;
			if (prep == 0)
				subty = SING;

			break;
		}
		for (t = st + 1; sent[t].cc == UNK; t++)
			;
		if (verb == 0 && prep == 0) {		/* UUU. */
			if (prep == 0)
				subty = SING;
			if (sent[t].cc == NV_PL || sent[t].cc == PNOUN) {	/* UUZ.*/
				if (sent[t+1].cc == UNK || sent[t+1].cc == NOUN_VERB) {	/* UUZU */
					sent[t+1].cc = VERB;
					verb = 1;
					sent[t].cc = NOUN;
					t1 = t;
				} else if (sent[t].cc == NV_PL) {		/* UUZ. */
					sent[t].cc = VERB;
					verb = 1;
					sent[t-1].cc = NOUN;
					t1 = t - 1;
				} else {
					sent[t].cc = NOUN;
					t1 = t;
				}
			} else {		/* UU. */
				if (sent[t].cc != ED) {
					sent[t-1].cc = VERB;
					verb = 1;
					sent[t-2].cc = NOUN;
					t1 = t - 2;
					t--;
				} else {
					sent[--t].cc = NOUN;
					t1 = t;
				}
			}
		} else {
			if (sent[t].cc == NOUN_VERB || sent[t].cc == NOUN || sent[t].cc == NV_PL || sent[t].cc == PNOUN) {
				sent[t].cc = NOUN;
				if (prep == 0)
					subty = PLURAL;
				t1 = t;
			} else {
				sent[--t].cc = NOUN;
				if (prep == 0)
					subty = SING;
				t1 = t;
			}
		}
		for (tt = st; tt < t1; tt++)
			sent[tt].cc = ADJ;
		st = t;
		break;
	}
getdef:
	if (sent[st].cc == CONJ && sent[st-1].cc == ADJ) {
		st++;
		goto b;
	}
	if (sent[st-1].cc == PREP && ( sent[st].cc == THAT || sent[st].cc == SUBCONJ)) {
		prep = 0;
		return(--st);
	}
	if (sent[st].cc != NOUN && sent[st].cc != PRONP && sent[st].cc != PRONS) {
		st--;
		if (sent[st].cc == ADJ && sent[st].ic == ING) {
			sent[st].cc = NOUN;
			if (prep == 0)
				subty = SING;
		} else if (sent[st].cc == PREP) {
			sent[st].cc = ADV;
		}
		prep = 0;
		return(st);
	}
	if (done == 1) {
		prep = 0;
		return(st);
	}
	if (sent[st+1].cc == ',') {
		if (sent[st+2].cc == CONJ) {
			if (rep == 0) {
				prep = 0;
				return(st);
			} else {
				st += 3;
				comma--;
				if (prep == 0)
					subty = PLURAL;
				prep = 1;
				goto b;
			}
		}
		if (comma == 1) {
			prep = 0;
			return(st);
		}

		switch (sent[st+2].cc) {
		case PREP:
		case SUBCONJ:
		case PRONS:
		case PRONP:
			prep = 0;
			return(st);
		default:	
			rep++;
			comma--;
			st += 2;
			if (prep == 0)
				subty = PLURAL;
			prep = 1;
			goto b;
		}
	}
	if (sent[st+1].cc == CONJ && sent[st+2].cc != ED) {
		st += 2;
		if (prep == 0)
			subty = PLURAL;
		prep = 1;
		goto b;
	}
	prep = 0;
	return(st);
}


who(kk, ce)
int	kk, ce;
{
	char	c;
	sent[kk].cc = PRONP;
	c = sent[kk+1].cc;
	while (isadv(c)) {
		sent[++kk].cc = ADV;
		c = sent[kk+1].cc;
	}
	if (c == UNK || c == NOUN_VERB || c == VERB_ADJ || c == ED || c == NV_PL || c == MVERB) {
		sent[++kk].cc = VERB;
		if (verb == 0)
			verb = getv(kk + 1, ce);
		return(kk);
	}
w:	
	switch (sent[++kk].cc) {
	case AUXX:
	case ADV:
	case BE:
	case VERB:
		goto w;
	default:
		verb = getv(kk, ce);
		return(--kk);
	}
}


