⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftp.tab.c

📁 含有BACKTARACKING的編譯軟體
💻 C
📖 第 1 页 / 共 3 页
字号:
			if ((cp = index(cbuf, '\r'))) {				*cp++ = '\n';				*cp = '\0';			}			if ((cp = strpbrk(cbuf, " \n")))				cpos = cp - cbuf;			if (cpos == 0)				cpos = 4;			c = cbuf[cpos];			cbuf[cpos] = '\0';			upper(cbuf);			p = lookup(cmdtab, cbuf);			cbuf[cpos] = c;			if (p != 0) {				if (p->implemented == 0) {					nack(p->name);					longjmp(errcatch,0);					/* NOTREACHED */				}				state = p->state;				*(char **)&yylval = p->name;				return (p->token);			}			break;		case SITECMD:			if (cbuf[cpos] == ' ') {				cpos++;				return (SP);			}			cp = &cbuf[cpos];			if ((cp2 = strpbrk(cp, " \n")))				cpos = cp2 - cbuf;			c = cbuf[cpos];			cbuf[cpos] = '\0';			upper(cp);			p = lookup(sitetab, cp);			cbuf[cpos] = c;			if (p != 0) {				if (p->implemented == 0) {					state = CMD;					nack(p->name);					longjmp(errcatch,0);					/* NOTREACHED */				}				state = p->state;				*(char **)&yylval = p->name;				return (p->token);			}			state = CMD;			break;		case OSTR:			if (cbuf[cpos] == '\n') {				state = CMD;				return (CRLF);			}			/* FALLTHROUGH */		case STR1:		case ZSTR1:		dostr1:			if (cbuf[cpos] == ' ') {				cpos++;				state = state == OSTR ? STR2 : ++state;				return (SP);			}			break;		case ZSTR2:			if (cbuf[cpos] == '\n') {				state = CMD;				return (CRLF);			}			/* FALLTHROUGH */		case STR2:			cp = &cbuf[cpos];			n = strlen(cp);			cpos += n - 1;			/*			 * Make sure the string is nonempty and \n terminated.			 */			if (n > 1 && cbuf[cpos] == '\n') {				cbuf[cpos] = '\0';				*(char **)&yylval = copy(cp);				cbuf[cpos] = '\n';				state = ARGS;				return (STRING);			}			break;		case NSTR:			if (cbuf[cpos] == ' ') {				cpos++;				return (SP);			}			if (isdigit(cbuf[cpos])) {				cp = &cbuf[cpos];				while (isdigit(cbuf[++cpos]))					;				c = cbuf[cpos];				cbuf[cpos] = '\0';				yylval = atoi(cp);				cbuf[cpos] = c;				state = STR1;				return (NUMBER);			}			state = STR1;			goto dostr1;		case ARGS:			if (isdigit(cbuf[cpos])) {				cp = &cbuf[cpos];				while (isdigit(cbuf[++cpos]))					;				c = cbuf[cpos];				cbuf[cpos] = '\0';				yylval = atoi(cp);				cbuf[cpos] = c;				return (NUMBER);			}			switch (cbuf[cpos++]) {			case '\n':				state = CMD;				return (CRLF);			case ' ':				return (SP);			case ',':				return (COMMA);			case 'A':			case 'a':				return (A);			case 'B':			case 'b':				return (B);			case 'C':			case 'c':				return (C);			case 'E':			case 'e':				return (E);			case 'F':			case 'f':				return (F);			case 'I':			case 'i':				return (I);			case 'L':			case 'l':				return (L);			case 'N':			case 'n':				return (N);			case 'P':			case 'p':				return (P);			case 'R':			case 'r':				return (R);			case 'S':			case 's':				return (S);			case 'T':			case 't':				return (T);			}			break;		default:			fatal("Unknown state in scanner.");		}		yyerror((char *) 0);		state = CMD;		longjmp(errcatch,0);	}}upper(s)	register char *s;{	while (*s != '\0') {		if (islower(*s))			*s = toupper(*s);		s++;	}}char *copy(s)	char *s;{	char *p;	extern char *malloc(), *strcpy();	p = malloc((unsigned) strlen(s) + 1);	if (p == NULL)		fatal("Ran out of memory.");	(void) strcpy(p, s);	return (p);}help(ctab, s)	struct tab *ctab;	char *s;{	register struct tab *c;	register int width, NCMDS;	char *type;	if (ctab == sitetab)		type = "SITE ";	else		type = "";	width = 0, NCMDS = 0;	for (c = ctab; c->name != NULL; c++) {		int len = strlen(c->name);		if (len > width)			width = len;		NCMDS++;	}	width = (width + 8) &~ 7;	if (s == 0) {		register int i, j, w;		int columns, lines;		lreply(214, "The following %scommands are recognized %s.",		    type, "(* =>'s unimplemented)");		columns = 76 / width;		if (columns == 0)			columns = 1;		lines = (NCMDS + columns - 1) / columns;		for (i = 0; i < lines; i++) {			printf("   ");			for (j = 0; j < columns; j++) {				c = ctab + j * lines + i;				printf("%s%c", c->name,					c->implemented ? ' ' : '*');				if (c + lines >= &ctab[NCMDS])					break;				w = strlen(c->name) + 1;				while (w < width) {					putchar(' ');					w++;				}			}			printf("\r\n");		}		(void) fflush(stdout);		reply(214, "Direct comments to ftp-bugs@%s.", hostname);		return;	}	upper(s);	c = lookup(ctab, s);	if (c == (struct tab *)0) {		reply(502, "Unknown command %s.", s);		return;	}	if (c->implemented)		reply(214, "Syntax: %s%s %s", type, c->name, c->help);	else		reply(214, "%s%-*s\t%s; unimplemented.", type, width,		    c->name, c->help);}sizecmd(filename)char *filename;{	switch (type) {	case TYPE_L:	case TYPE_I: {		struct stat stbuf;		if (stat(filename, &stbuf) < 0 ||		    (stbuf.st_mode&S_IFMT) != S_IFREG)			reply(550, "%s: not a plain file.", filename);		else			reply(213, "%lu", stbuf.st_size);		break;}	case TYPE_A: {		FILE *fin;		register int c, count;		struct stat stbuf;		fin = fopen(filename, "r");		if (fin == NULL) {			perror_reply(550, filename);			return;		}		if (fstat(fileno(fin), &stbuf) < 0 ||		    (stbuf.st_mode&S_IFMT) != S_IFREG) {			reply(550, "%s: not a plain file.", filename);			(void) fclose(fin);			return;		}		count = 0;		while((c=getc(fin)) != EOF) {			if (c == '\n')	/* will get expanded to \r\n */				count++;			count++;		}		(void) fclose(fin);		reply(213, "%ld", count);		break;}	default:		reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);	}}#line 909 "ftp.tab.c"#define YYABORT goto yyabort#define YYREJECT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlabintyyparse(void){    register int yym, yyn, yystate;#if YYDEBUG    register char *yys;    extern char *getenv();    if (yys = getenv("YYDEBUG"))    {        yyn = *yys;        if (yyn >= '0' && yyn <= '9')            yydebug = yyn - '0';    }#endif    yynerrs = 0;    yyerrflag = 0;    yychar = (-1);    yyssp = yyss;    yyvsp = yyvs;    *yyssp = yystate = 0;yyloop:    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;    if (yychar < 0)    {        if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG        if (yydebug)        {            yys = 0;            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];            if (!yys) yys = "illegal-symbol";            printf("%sdebug: state %d, reading %d (%s)\n",                    YYPREFIX, yystate, yychar, yys);        }#endif    }    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)    {#if YYDEBUG        if (yydebug)            printf("%sdebug: state %d, shifting to state %d\n",                    YYPREFIX, yystate, yytable[yyn]);#endif        if (yyssp >= yyss + yystacksize - 1)        {            goto yyoverflow;        }        *++yyssp = yystate = yytable[yyn];        *++yyvsp = yylval;        yychar = (-1);        if (yyerrflag > 0)  --yyerrflag;        goto yyloop;    }    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)    {        yyn = yytable[yyn];        goto yyreduce;    }    if (yyerrflag) goto yyinrecovery;#ifdef lint    goto yynewerror;#endifyynewerror:    yyerror("syntax error");#ifdef lint    goto yyerrlab;#endifyyerrlab:    ++yynerrs;yyinrecovery:    if (yyerrflag < 3)    {        yyerrflag = 3;        for (;;)        {            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)            {#if YYDEBUG                if (yydebug)                    printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);#endif                if (yyssp >= yyss + yystacksize - 1)                {                    goto yyoverflow;                }                *++yyssp = yystate = yytable[yyn];                *++yyvsp = yylval;                goto yyloop;            }            else            {#if YYDEBUG                if (yydebug)                    printf("%sdebug: error recovery discarding state %d\n",                            YYPREFIX, *yyssp);#endif                if (yyssp <= yyss) goto yyabort;                --yyssp;                --yyvsp;            }        }    }    else    {        if (yychar == 0) goto yyabort;#if YYDEBUG        if (yydebug)        {            yys = 0;            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];            if (!yys) yys = "illegal-symbol";            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",                    YYPREFIX, yystate, yychar, yys);        }#endif        yychar = (-1);        goto yyloop;    }yyreduce:#if YYDEBUG    if (yydebug)        printf("%sdebug: state %d, reducing by rule %d (%s)\n",                YYPREFIX, yystate, yyn, yyrule[yyn]);#endif    yym = yylen[yyn];    yyval = yyvsp[1-yym];    switch (yyn)    {case 2:#line 99 "ftp.y" {			fromname = (char *) 0;		}break;case 4:#line 106 "ftp.y" {			user((char *) yyvsp[-1]);			free((char *) yyvsp[-1]);		}break;case 5:#line 111 "ftp.y" {			pass((char *) yyvsp[-1]);			free((char *) yyvsp[-1]);		}break;case 6:#line 116 "ftp.y" {			usedefault = 0;			if (pdata >= 0) {				(void) close(pdata);				pdata = -1;			}			reply(200, "PORT command successful.");		}break;case 7:#line 125 "ftp.y" {			passive();		}break;case 8:#line 129 "ftp.y" {			switch (cmd_type) {			case TYPE_A:				if (cmd_form == FORM_N) {					reply(200, "Type set to A.");					type = cmd_type;					form = cmd_form;				} else					reply(504, "Form must be N.");				break;			case TYPE_E:				reply(504, "Type E not implemented.");				break;			case TYPE_I:				reply(200, "Type set to I.");				type = cmd_type;				break;			case TYPE_L:#if NBBY == 8				if (cmd_bytesz == 8) {					reply(200,					    "Type set to L (byte size 8).");					type = cmd_type;				} else					reply(504, "Byte size must be 8.");#else /* NBBY == 8 */				UNIMPLEMENTED for NBBY != 8#endif /* NBBY == 8 */			}		}break;case 9:#line 164 "ftp.y" {			switch (yyvsp[-1]) {			case STRU_F:				reply(200, "STRU F ok.");				break;			default:				reply(504, "Unimplemented STRU type.");			}		}break;case 10:#line 176 "ftp.y" {			switch (yyvsp[-1]) {			case MODE_S:				reply(200, "MODE S ok.");				break;			default:				reply(502, "Unimplemented MODE type.");			}		}break;case 11:#line 188 "ftp.y" {			reply(202, "ALLO command ignored.");		}break;case 12:#line 192 "ftp.y" {			reply(202, "ALLO command ignored.");		}break;case 13:#line 196 "ftp.y"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -