home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / byacc19 / part02 < prev    next >
Encoding:
Text File  |  1993-07-04  |  72.6 KB  |  4,086 lines

  1. Newsgroups: comp.sources.unix
  2. From: robert.corbett@eng.Sun.COM (Roger Corbett)
  3. Subject: v26i290: byacc-1.9 - Berkeley YACC, Part02/03
  4. Sender: unix-sources-moderator@gw.home.vix.com
  5. Approved: vixie@gw.home.vix.com
  6.  
  7. Submitted-By: robert.corbett@eng.Sun.COM (Roger Corbett)
  8. Posting-Number: Volume 26, Issue 290
  9. Archive-Name: byacc-1.9/part02
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 2 (of 3)."
  18. # Contents:  output.c test/ftp.output test/ftp.y
  19. # Wrapped by vixie@gw.home.vix.com on Mon Jul  5 19:23:04 1993
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'output.c' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'output.c'\"
  23. else
  24. echo shar: Extracting \"'output.c'\" \(22710 characters\)
  25. sed "s/^X//" >'output.c' <<'END_OF_FILE'
  26. X#include "defs.h"
  27. X
  28. Xstatic int nvectors;
  29. Xstatic int nentries;
  30. Xstatic short **froms;
  31. Xstatic short **tos;
  32. Xstatic short *tally;
  33. Xstatic short *width;
  34. Xstatic short *state_count;
  35. Xstatic short *order;
  36. Xstatic short *base;
  37. Xstatic short *pos;
  38. Xstatic int maxtable;
  39. Xstatic short *table;
  40. Xstatic short *check;
  41. Xstatic int lowzero;
  42. Xstatic int high;
  43. X
  44. X
  45. Xoutput()
  46. X{
  47. X    free_itemsets();
  48. X    free_shifts();
  49. X    free_reductions();
  50. X    output_prefix();
  51. X    output_stored_text();
  52. X    output_defines();
  53. X    output_rule_data();
  54. X    output_yydefred();
  55. X    output_actions();
  56. X    free_parser();
  57. X    output_debug();
  58. X    output_stype();
  59. X    if (rflag) write_section(tables);
  60. X    write_section(header);
  61. X    output_trailing_text();
  62. X    write_section(body);
  63. X    output_semantic_actions();
  64. X    write_section(trailer);
  65. X}
  66. X
  67. X
  68. Xoutput_prefix()
  69. X{
  70. X    if (symbol_prefix == NULL)
  71. X    symbol_prefix = "yy";
  72. X    else
  73. X    {
  74. X    ++outline;
  75. X    fprintf(code_file, "#define yyparse %sparse\n", symbol_prefix);
  76. X    ++outline;
  77. X    fprintf(code_file, "#define yylex %slex\n", symbol_prefix);
  78. X    ++outline;
  79. X    fprintf(code_file, "#define yyerror %serror\n", symbol_prefix);
  80. X    ++outline;
  81. X    fprintf(code_file, "#define yychar %schar\n", symbol_prefix);
  82. X    ++outline;
  83. X    fprintf(code_file, "#define yyval %sval\n", symbol_prefix);
  84. X    ++outline;
  85. X    fprintf(code_file, "#define yylval %slval\n", symbol_prefix);
  86. X    ++outline;
  87. X    fprintf(code_file, "#define yydebug %sdebug\n", symbol_prefix);
  88. X    ++outline;
  89. X    fprintf(code_file, "#define yynerrs %snerrs\n", symbol_prefix);
  90. X    ++outline;
  91. X    fprintf(code_file, "#define yyerrflag %serrflag\n", symbol_prefix);
  92. X    ++outline;
  93. X    fprintf(code_file, "#define yyss %sss\n", symbol_prefix);
  94. X    ++outline;
  95. X    fprintf(code_file, "#define yyssp %sssp\n", symbol_prefix);
  96. X    ++outline;
  97. X    fprintf(code_file, "#define yyvs %svs\n", symbol_prefix);
  98. X    ++outline;
  99. X    fprintf(code_file, "#define yyvsp %svsp\n", symbol_prefix);
  100. X    ++outline;
  101. X    fprintf(code_file, "#define yylhs %slhs\n", symbol_prefix);
  102. X    ++outline;
  103. X    fprintf(code_file, "#define yylen %slen\n", symbol_prefix);
  104. X    ++outline;
  105. X    fprintf(code_file, "#define yydefred %sdefred\n", symbol_prefix);
  106. X    ++outline;
  107. X    fprintf(code_file, "#define yydgoto %sdgoto\n", symbol_prefix);
  108. X    ++outline;
  109. X    fprintf(code_file, "#define yysindex %ssindex\n", symbol_prefix);
  110. X    ++outline;
  111. X    fprintf(code_file, "#define yyrindex %srindex\n", symbol_prefix);
  112. X    ++outline;
  113. X    fprintf(code_file, "#define yygindex %sgindex\n", symbol_prefix);
  114. X    ++outline;
  115. X    fprintf(code_file, "#define yytable %stable\n", symbol_prefix);
  116. X    ++outline;
  117. X    fprintf(code_file, "#define yycheck %scheck\n", symbol_prefix);
  118. X    ++outline;
  119. X    fprintf(code_file, "#define yyname %sname\n", symbol_prefix);
  120. X    ++outline;
  121. X    fprintf(code_file, "#define yyrule %srule\n", symbol_prefix);
  122. X    }
  123. X    ++outline;
  124. X    fprintf(code_file, "#define YYPREFIX \"%s\"\n", symbol_prefix);
  125. X}
  126. X
  127. X
  128. Xoutput_rule_data()
  129. X{
  130. X    register int i;
  131. X    register int j;
  132. X
  133. X  
  134. X    fprintf(output_file, "short %slhs[] = {%42d,", symbol_prefix,
  135. X        symbol_value[start_symbol]);
  136. X
  137. X    j = 10;
  138. X    for (i = 3; i < nrules; i++)
  139. X    {
  140. X    if (j >= 10)
  141. X    {
  142. X        if (!rflag) ++outline;
  143. X        putc('\n', output_file);
  144. X        j = 1;
  145. X    }
  146. X        else
  147. X        ++j;
  148. X
  149. X        fprintf(output_file, "%5d,", symbol_value[rlhs[i]]);
  150. X    }
  151. X    if (!rflag) outline += 2;
  152. X    fprintf(output_file, "\n};\n");
  153. X
  154. X    fprintf(output_file, "short %slen[] = {%42d,", symbol_prefix, 2);
  155. X
  156. X    j = 10;
  157. X    for (i = 3; i < nrules; i++)
  158. X    {
  159. X    if (j >= 10)
  160. X    {
  161. X        if (!rflag) ++outline;
  162. X        putc('\n', output_file);
  163. X        j = 1;
  164. X    }
  165. X    else
  166. X      j++;
  167. X
  168. X        fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1);
  169. X    }
  170. X    if (!rflag) outline += 2;
  171. X    fprintf(output_file, "\n};\n");
  172. X}
  173. X
  174. X
  175. Xoutput_yydefred()
  176. X{
  177. X    register int i, j;
  178. X
  179. X    fprintf(output_file, "short %sdefred[] = {%39d,", symbol_prefix,
  180. X        (defred[0] ? defred[0] - 2 : 0));
  181. X
  182. X    j = 10;
  183. X    for (i = 1; i < nstates; i++)
  184. X    {
  185. X    if (j < 10)
  186. X        ++j;
  187. X    else
  188. X    {
  189. X        if (!rflag) ++outline;
  190. X        putc('\n', output_file);
  191. X        j = 1;
  192. X    }
  193. X
  194. X    fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0));
  195. X    }
  196. X
  197. X    if (!rflag) outline += 2;
  198. X    fprintf(output_file, "\n};\n");
  199. X}
  200. X
  201. X
  202. Xoutput_actions()
  203. X{
  204. X    nvectors = 2*nstates + nvars;
  205. X
  206. X    froms = NEW2(nvectors, short *);
  207. X    tos = NEW2(nvectors, short *);
  208. X    tally = NEW2(nvectors, short);
  209. X    width = NEW2(nvectors, short);
  210. X
  211. X    token_actions();
  212. X    FREE(lookaheads);
  213. X    FREE(LA);
  214. X    FREE(LAruleno);
  215. X    FREE(accessing_symbol);
  216. X
  217. X    goto_actions();
  218. X    FREE(goto_map + ntokens);
  219. X    FREE(from_state);
  220. X    FREE(to_state);
  221. X
  222. X    sort_actions();
  223. X    pack_table();
  224. X    output_base();
  225. X    output_table();
  226. X    output_check();
  227. X}
  228. X
  229. X
  230. Xtoken_actions()
  231. X{
  232. X    register int i, j;
  233. X    register int shiftcount, reducecount;
  234. X    register int max, min;
  235. X    register short *actionrow, *r, *s;
  236. X    register action *p;
  237. X
  238. X    actionrow = NEW2(2*ntokens, short);
  239. X    for (i = 0; i < nstates; ++i)
  240. X    {
  241. X    if (parser[i])
  242. X    {
  243. X        for (j = 0; j < 2*ntokens; ++j)
  244. X        actionrow[j] = 0;
  245. X
  246. X        shiftcount = 0;
  247. X        reducecount = 0;
  248. X        for (p = parser[i]; p; p = p->next)
  249. X        {
  250. X        if (p->suppressed == 0)
  251. X        {
  252. X            if (p->action_code == SHIFT)
  253. X            {
  254. X            ++shiftcount;
  255. X            actionrow[p->symbol] = p->number;
  256. X            }
  257. X            else if (p->action_code == REDUCE && p->number != defred[i])
  258. X            {
  259. X            ++reducecount;
  260. X            actionrow[p->symbol + ntokens] = p->number;
  261. X            }
  262. X        }
  263. X        }
  264. X
  265. X        tally[i] = shiftcount;
  266. X        tally[nstates+i] = reducecount;
  267. X        width[i] = 0;
  268. X        width[nstates+i] = 0;
  269. X        if (shiftcount > 0)
  270. X        {
  271. X        froms[i] = r = NEW2(shiftcount, short);
  272. X        tos[i] = s = NEW2(shiftcount, short);
  273. X        min = MAXSHORT;
  274. X        max = 0;
  275. X        for (j = 0; j < ntokens; ++j)
  276. X        {
  277. X            if (actionrow[j])
  278. X            {
  279. X            if (min > symbol_value[j])
  280. X                min = symbol_value[j];
  281. X            if (max < symbol_value[j])
  282. X                max = symbol_value[j];
  283. X            *r++ = symbol_value[j];
  284. X            *s++ = actionrow[j];
  285. X            }
  286. X        }
  287. X        width[i] = max - min + 1;
  288. X        }
  289. X        if (reducecount > 0)
  290. X        {
  291. X        froms[nstates+i] = r = NEW2(reducecount, short);
  292. X        tos[nstates+i] = s = NEW2(reducecount, short);
  293. X        min = MAXSHORT;
  294. X        max = 0;
  295. X        for (j = 0; j < ntokens; ++j)
  296. X        {
  297. X            if (actionrow[ntokens+j])
  298. X            {
  299. X            if (min > symbol_value[j])
  300. X                min = symbol_value[j];
  301. X            if (max < symbol_value[j])
  302. X                max = symbol_value[j];
  303. X            *r++ = symbol_value[j];
  304. X            *s++ = actionrow[ntokens+j] - 2;
  305. X            }
  306. X        }
  307. X        width[nstates+i] = max - min + 1;
  308. X        }
  309. X    }
  310. X    }
  311. X    FREE(actionrow);
  312. X}
  313. X
  314. Xgoto_actions()
  315. X{
  316. X    register int i, j, k;
  317. X
  318. X    state_count = NEW2(nstates, short);
  319. X
  320. X    k = default_goto(start_symbol + 1);
  321. X    fprintf(output_file, "short %sdgoto[] = {%40d,", symbol_prefix, k);
  322. X    save_column(start_symbol + 1, k);
  323. X
  324. X    j = 10;
  325. X    for (i = start_symbol + 2; i < nsyms; i++)
  326. X    {
  327. X    if (j >= 10)
  328. X    {
  329. X        if (!rflag) ++outline;
  330. X        putc('\n', output_file);
  331. X        j = 1;
  332. X    }
  333. X    else
  334. X        ++j;
  335. X
  336. X    k = default_goto(i);
  337. X    fprintf(output_file, "%5d,", k);
  338. X    save_column(i, k);
  339. X    }
  340. X
  341. X    if (!rflag) outline += 2;
  342. X    fprintf(output_file, "\n};\n");
  343. X    FREE(state_count);
  344. X}
  345. X
  346. Xint
  347. Xdefault_goto(symbol)
  348. Xint symbol;
  349. X{
  350. X    register int i;
  351. X    register int m;
  352. X    register int n;
  353. X    register int default_state;
  354. X    register int max;
  355. X
  356. X    m = goto_map[symbol];
  357. X    n = goto_map[symbol + 1];
  358. X
  359. X    if (m == n) return (0);
  360. X
  361. X    for (i = 0; i < nstates; i++)
  362. X    state_count[i] = 0;
  363. X
  364. X    for (i = m; i < n; i++)
  365. X    state_count[to_state[i]]++;
  366. X
  367. X    max = 0;
  368. X    default_state = 0;
  369. X    for (i = 0; i < nstates; i++)
  370. X    {
  371. X    if (state_count[i] > max)
  372. X    {
  373. X        max = state_count[i];
  374. X        default_state = i;
  375. X    }
  376. X    }
  377. X
  378. X    return (default_state);
  379. X}
  380. X
  381. X
  382. X
  383. Xsave_column(symbol, default_state)
  384. Xint symbol;
  385. Xint default_state;
  386. X{
  387. X    register int i;
  388. X    register int m;
  389. X    register int n;
  390. X    register short *sp;
  391. X    register short *sp1;
  392. X    register short *sp2;
  393. X    register int count;
  394. X    register int symno;
  395. X
  396. X    m = goto_map[symbol];
  397. X    n = goto_map[symbol + 1];
  398. X
  399. X    count = 0;
  400. X    for (i = m; i < n; i++)
  401. X    {
  402. X    if (to_state[i] != default_state)
  403. X        ++count;
  404. X    }
  405. X    if (count == 0) return;
  406. X
  407. X    symno = symbol_value[symbol] + 2*nstates;
  408. X
  409. X    froms[symno] = sp1 = sp = NEW2(count, short);
  410. X    tos[symno] = sp2 = NEW2(count, short);
  411. X
  412. X    for (i = m; i < n; i++)
  413. X    {
  414. X    if (to_state[i] != default_state)
  415. X    {
  416. X        *sp1++ = from_state[i];
  417. X        *sp2++ = to_state[i];
  418. X    }
  419. X    }
  420. X
  421. X    tally[symno] = count;
  422. X    width[symno] = sp1[-1] - sp[0] + 1;
  423. X}
  424. X
  425. Xsort_actions()
  426. X{
  427. X  register int i;
  428. X  register int j;
  429. X  register int k;
  430. X  register int t;
  431. X  register int w;
  432. X
  433. X  order = NEW2(nvectors, short);
  434. X  nentries = 0;
  435. X
  436. X  for (i = 0; i < nvectors; i++)
  437. X    {
  438. X      if (tally[i] > 0)
  439. X    {
  440. X      t = tally[i];
  441. X      w = width[i];
  442. X      j = nentries - 1;
  443. X
  444. X      while (j >= 0 && (width[order[j]] < w))
  445. X        j--;
  446. X
  447. X      while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t))
  448. X        j--;
  449. X
  450. X      for (k = nentries - 1; k > j; k--)
  451. X        order[k + 1] = order[k];
  452. X
  453. X      order[j + 1] = i;
  454. X      nentries++;
  455. X    }
  456. X    }
  457. X}
  458. X
  459. X
  460. Xpack_table()
  461. X{
  462. X    register int i;
  463. X    register int place;
  464. X    register int state;
  465. X
  466. X    base = NEW2(nvectors, short);
  467. X    pos = NEW2(nentries, short);
  468. X
  469. X    maxtable = 1000;
  470. X    table = NEW2(maxtable, short);
  471. X    check = NEW2(maxtable, short);
  472. X
  473. X    lowzero = 0;
  474. X    high = 0;
  475. X
  476. X    for (i = 0; i < maxtable; i++)
  477. X    check[i] = -1;
  478. X
  479. X    for (i = 0; i < nentries; i++)
  480. X    {
  481. X    state = matching_vector(i);
  482. X
  483. X    if (state < 0)
  484. X        place = pack_vector(i);
  485. X    else
  486. X        place = base[state];
  487. X
  488. X    pos[i] = place;
  489. X    base[order[i]] = place;
  490. X    }
  491. X
  492. X    for (i = 0; i < nvectors; i++)
  493. X    {
  494. X    if (froms[i])
  495. X        FREE(froms[i]);
  496. X    if (tos[i])
  497. X        FREE(tos[i]);
  498. X    }
  499. X
  500. X    FREE(froms);
  501. X    FREE(tos);
  502. X    FREE(pos);
  503. X}
  504. X
  505. X
  506. X/*  The function matching_vector determines if the vector specified by    */
  507. X/*  the input parameter matches a previously considered    vector.  The    */
  508. X/*  test at the start of the function checks if the vector represents    */
  509. X/*  a row of shifts over terminal symbols or a row of reductions, or a    */
  510. X/*  column of shifts over a nonterminal symbol.  Berkeley Yacc does not    */
  511. X/*  check if a column of shifts over a nonterminal symbols matches a    */
  512. X/*  previously considered vector.  Because of the nature of LR parsing    */
  513. X/*  tables, no two columns can match.  Therefore, the only possible    */
  514. X/*  match would be between a row and a column.  Such matches are    */
  515. X/*  unlikely.  Therefore, to save time, no attempt is made to see if a    */
  516. X/*  column matches a previously considered vector.            */
  517. X/*                                    */
  518. X/*  Matching_vector is poorly designed.  The test could easily be made    */
  519. X/*  faster.  Also, it depends on the vectors being in a specific    */
  520. X/*  order.                                */
  521. X
  522. Xint
  523. Xmatching_vector(vector)
  524. Xint vector;
  525. X{
  526. X    register int i;
  527. X    register int j;
  528. X    register int k;
  529. X    register int t;
  530. X    register int w;
  531. X    register int match;
  532. X    register int prev;
  533. X
  534. X    i = order[vector];
  535. X    if (i >= 2*nstates)
  536. X    return (-1);
  537. X
  538. X    t = tally[i];
  539. X    w = width[i];
  540. X
  541. X    for (prev = vector - 1; prev >= 0; prev--)
  542. X    {
  543. X    j = order[prev];
  544. X    if (width[j] != w || tally[j] != t)
  545. X        return (-1);
  546. X
  547. X    match = 1;
  548. X    for (k = 0; match && k < t; k++)
  549. X    {
  550. X        if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
  551. X        match = 0;
  552. X    }
  553. X
  554. X    if (match)
  555. X        return (j);
  556. X    }
  557. X
  558. X    return (-1);
  559. X}
  560. X
  561. X
  562. X
  563. Xint
  564. Xpack_vector(vector)
  565. Xint vector;
  566. X{
  567. X    register int i, j, k, l;
  568. X    register int t;
  569. X    register int loc;
  570. X    register int ok;
  571. X    register short *from;
  572. X    register short *to;
  573. X    int newmax;
  574. X
  575. X    i = order[vector];
  576. X    t = tally[i];
  577. X    assert(t);
  578. X
  579. X    from = froms[i];
  580. X    to = tos[i];
  581. X
  582. X    j = lowzero - from[0];
  583. X    for (k = 1; k < t; ++k)
  584. X    if (lowzero - from[k] > j)
  585. X        j = lowzero - from[k];
  586. X    for (;; ++j)
  587. X    {
  588. X    if (j == 0)
  589. X        continue;
  590. X    ok = 1;
  591. X    for (k = 0; ok && k < t; k++)
  592. X    {
  593. X        loc = j + from[k];
  594. X        if (loc >= maxtable)
  595. X        {
  596. X        if (loc >= MAXTABLE)
  597. X            fatal("maximum table size exceeded");
  598. X
  599. X        newmax = maxtable;
  600. X        do { newmax += 200; } while (newmax <= loc);
  601. X        table = (short *) REALLOC(table, newmax*sizeof(short));
  602. X        if (table == 0) no_space();
  603. X        check = (short *) REALLOC(check, newmax*sizeof(short));
  604. X        if (check == 0) no_space();
  605. X        for (l  = maxtable; l < newmax; ++l)
  606. X        {
  607. X            table[l] = 0;
  608. X            check[l] = -1;
  609. X        }
  610. X        maxtable = newmax;
  611. X        }
  612. X
  613. X        if (check[loc] != -1)
  614. X        ok = 0;
  615. X    }
  616. X    for (k = 0; ok && k < vector; k++)
  617. X    {
  618. X        if (pos[k] == j)
  619. X        ok = 0;
  620. X    }
  621. X    if (ok)
  622. X    {
  623. X        for (k = 0; k < t; k++)
  624. X        {
  625. X        loc = j + from[k];
  626. X        table[loc] = to[k];
  627. X        check[loc] = from[k];
  628. X        if (loc > high) high = loc;
  629. X        }
  630. X
  631. X        while (check[lowzero] != -1)
  632. X        ++lowzero;
  633. X
  634. X        return (j);
  635. X    }
  636. X    }
  637. X}
  638. X
  639. X
  640. X
  641. Xoutput_base()
  642. X{
  643. X    register int i, j;
  644. X
  645. X    fprintf(output_file, "short %ssindex[] = {%39d,", symbol_prefix, base[0]);
  646. X
  647. X    j = 10;
  648. X    for (i = 1; i < nstates; i++)
  649. X    {
  650. X    if (j >= 10)
  651. X    {
  652. X        if (!rflag) ++outline;
  653. X        putc('\n', output_file);
  654. X        j = 1;
  655. X    }
  656. X    else
  657. X        ++j;
  658. X
  659. X    fprintf(output_file, "%5d,", base[i]);
  660. X    }
  661. X
  662. X    if (!rflag) outline += 2;
  663. X    fprintf(output_file, "\n};\nshort %srindex[] = {%39d,", symbol_prefix,
  664. X        base[nstates]);
  665. X
  666. X    j = 10;
  667. X    for (i = nstates + 1; i < 2*nstates; i++)
  668. X    {
  669. X    if (j >= 10)
  670. X    {
  671. X        if (!rflag) ++outline;
  672. X        putc('\n', output_file);
  673. X        j = 1;
  674. X    }
  675. X    else
  676. X        ++j;
  677. X
  678. X    fprintf(output_file, "%5d,", base[i]);
  679. X    }
  680. X
  681. X    if (!rflag) outline += 2;
  682. X    fprintf(output_file, "\n};\nshort %sgindex[] = {%39d,", symbol_prefix,
  683. X        base[2*nstates]);
  684. X
  685. X    j = 10;
  686. X    for (i = 2*nstates + 1; i < nvectors - 1; i++)
  687. X    {
  688. X    if (j >= 10)
  689. X    {
  690. X        if (!rflag) ++outline;
  691. X        putc('\n', output_file);
  692. X        j = 1;
  693. X    }
  694. X    else
  695. X        ++j;
  696. X
  697. X    fprintf(output_file, "%5d,", base[i]);
  698. X    }
  699. X
  700. X    if (!rflag) outline += 2;
  701. X    fprintf(output_file, "\n};\n");
  702. X    FREE(base);
  703. X}
  704. X
  705. X
  706. X
  707. Xoutput_table()
  708. X{
  709. X    register int i;
  710. X    register int j;
  711. X
  712. X    ++outline;
  713. X    fprintf(code_file, "#define YYTABLESIZE %d\n", high);
  714. X    fprintf(output_file, "short %stable[] = {%40d,", symbol_prefix,
  715. X        table[0]);
  716. X
  717. X    j = 10;
  718. X    for (i = 1; i <= high; i++)
  719. X    {
  720. X    if (j >= 10)
  721. X    {
  722. X        if (!rflag) ++outline;
  723. X        putc('\n', output_file);
  724. X        j = 1;
  725. X    }
  726. X    else
  727. X        ++j;
  728. X
  729. X    fprintf(output_file, "%5d,", table[i]);
  730. X    }
  731. X
  732. X    if (!rflag) outline += 2;
  733. X    fprintf(output_file, "\n};\n");
  734. X    FREE(table);
  735. X}
  736. X
  737. X
  738. X
  739. Xoutput_check()
  740. X{
  741. X    register int i;
  742. X    register int j;
  743. X
  744. X    fprintf(output_file, "short %scheck[] = {%40d,", symbol_prefix,
  745. X        check[0]);
  746. X
  747. X    j = 10;
  748. X    for (i = 1; i <= high; i++)
  749. X    {
  750. X    if (j >= 10)
  751. X    {
  752. X        if (!rflag) ++outline;
  753. X        putc('\n', output_file);
  754. X        j = 1;
  755. X    }
  756. X    else
  757. X        ++j;
  758. X
  759. X    fprintf(output_file, "%5d,", check[i]);
  760. X    }
  761. X
  762. X    if (!rflag) outline += 2;
  763. X    fprintf(output_file, "\n};\n");
  764. X    FREE(check);
  765. X}
  766. X
  767. X
  768. Xint
  769. Xis_C_identifier(name)
  770. Xchar *name;
  771. X{
  772. X    register char *s;
  773. X    register int c;
  774. X
  775. X    s = name;
  776. X    c = *s;
  777. X    if (c == '"')
  778. X    {
  779. X    c = *++s;
  780. X    if (!isalpha(c) && c != '_' && c != '$')
  781. X        return (0);
  782. X    while ((c = *++s) != '"')
  783. X    {
  784. X        if (!isalnum(c) && c != '_' && c != '$')
  785. X        return (0);
  786. X    }
  787. X    return (1);
  788. X    }
  789. X
  790. X    if (!isalpha(c) && c != '_' && c != '$')
  791. X    return (0);
  792. X    while (c = *++s)
  793. X    {
  794. X    if (!isalnum(c) && c != '_' && c != '$')
  795. X        return (0);
  796. X    }
  797. X    return (1);
  798. X}
  799. X
  800. X
  801. Xoutput_defines()
  802. X{
  803. X    register int c, i;
  804. X    register char *s;
  805. X
  806. X    for (i = 2; i < ntokens; ++i)
  807. X    {
  808. X    s = symbol_name[i];
  809. X    if (is_C_identifier(s))
  810. X    {
  811. X        fprintf(code_file, "#define ");
  812. X        if (dflag) fprintf(defines_file, "#define ");
  813. X        c = *s;
  814. X        if (c == '"')
  815. X        {
  816. X        while ((c = *++s) != '"')
  817. X        {
  818. X            putc(c, code_file);
  819. X            if (dflag) putc(c, defines_file);
  820. X        }
  821. X        }
  822. X        else
  823. X        {
  824. X        do
  825. X        {
  826. X            putc(c, code_file);
  827. X            if (dflag) putc(c, defines_file);
  828. X        }
  829. X        while (c = *++s);
  830. X        }
  831. X        ++outline;
  832. X        fprintf(code_file, " %d\n", symbol_value[i]);
  833. X        if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]);
  834. X    }
  835. X    }
  836. X
  837. X    ++outline;
  838. X    fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]);
  839. X
  840. X    if (dflag && unionized)
  841. X    {
  842. X    fclose(union_file);
  843. X    union_file = fopen(union_file_name, "r");
  844. X    if (union_file == NULL) open_error(union_file_name);
  845. X    while ((c = getc(union_file)) != EOF)
  846. X        putc(c, defines_file);
  847. X    fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n",
  848. X        symbol_prefix);
  849. X    }
  850. X}
  851. X
  852. X
  853. Xoutput_stored_text()
  854. X{
  855. X    register int c;
  856. X    register FILE *in, *out;
  857. X
  858. X    fclose(text_file);
  859. X    text_file = fopen(text_file_name, "r");
  860. X    if (text_file == NULL)
  861. X    open_error(text_file_name);
  862. X    in = text_file;
  863. X    if ((c = getc(in)) == EOF)
  864. X    return;
  865. X    out = code_file;
  866. X    if (c ==  '\n')
  867. X    ++outline;
  868. X    putc(c, out);
  869. X    while ((c = getc(in)) != EOF)
  870. X    {
  871. X    if (c == '\n')
  872. X        ++outline;
  873. X    putc(c, out);
  874. X    }
  875. X    if (!lflag)
  876. X    fprintf(out, line_format, ++outline + 1, code_file_name);
  877. X}
  878. X
  879. X
  880. Xoutput_debug()
  881. X{
  882. X    register int i, j, k, max;
  883. X    char **symnam, *s;
  884. X
  885. X    ++outline;
  886. X    fprintf(code_file, "#define YYFINAL %d\n", final_state);
  887. X    outline += 3;
  888. X    fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
  889. X        tflag);
  890. X    if (rflag)
  891. X    fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n",
  892. X        tflag);
  893. X
  894. X    max = 0;
  895. X    for (i = 2; i < ntokens; ++i)
  896. X    if (symbol_value[i] > max)
  897. X        max = symbol_value[i];
  898. X    ++outline;
  899. X    fprintf(code_file, "#define YYMAXTOKEN %d\n", max);
  900. X
  901. X    symnam = (char **) MALLOC((max+1)*sizeof(char *));
  902. X    if (symnam == 0) no_space();
  903. X
  904. X    /* Note that it is  not necessary to initialize the element        */
  905. X    /* symnam[max].                            */
  906. X    for (i = 0; i < max; ++i)
  907. X    symnam[i] = 0;
  908. X    for (i = ntokens - 1; i >= 2; --i)
  909. X    symnam[symbol_value[i]] = symbol_name[i];
  910. X    symnam[0] = "end-of-file";
  911. X
  912. X    if (!rflag) ++outline;
  913. X    fprintf(output_file, "#if YYDEBUG\nchar *%sname[] = {", symbol_prefix);
  914. X    j = 80;
  915. X    for (i = 0; i <= max; ++i)
  916. X    {
  917. X    if (s = symnam[i])
  918. X    {
  919. X        if (s[0] == '"')
  920. X        {
  921. X        k = 7;
  922. X        while (*++s != '"')
  923. X        {
  924. X            ++k;
  925. X            if (*s == '\\')
  926. X            {
  927. X            k += 2;
  928. X            if (*++s == '\\')
  929. X                ++k;
  930. X            }
  931. X        }
  932. X        j += k;
  933. X        if (j > 80)
  934. X        {
  935. X            if (!rflag) ++outline;
  936. X            putc('\n', output_file);
  937. X            j = k;
  938. X        }
  939. X        fprintf(output_file, "\"\\\"");
  940. X        s = symnam[i];
  941. X        while (*++s != '"')
  942. X        {
  943. X            if (*s == '\\')
  944. X            {
  945. X            fprintf(output_file, "\\\\");
  946. X            if (*++s == '\\')
  947. X                fprintf(output_file, "\\\\");
  948. X            else
  949. X                putc(*s, output_file);
  950. X            }
  951. X            else
  952. X            putc(*s, output_file);
  953. X        }
  954. X        fprintf(output_file, "\\\"\",");
  955. X        }
  956. X        else if (s[0] == '\'')
  957. X        {
  958. X        if (s[1] == '"')
  959. X        {
  960. X            j += 7;
  961. X            if (j > 80)
  962. X            {
  963. X            if (!rflag) ++outline;
  964. X            putc('\n', output_file);
  965. X            j = 7;
  966. X            }
  967. X            fprintf(output_file, "\"'\\\"'\",");
  968. X        }
  969. X        else
  970. X        {
  971. X            k = 5;
  972. X            while (*++s != '\'')
  973. X            {
  974. X            ++k;
  975. X            if (*s == '\\')
  976. X            {
  977. X                k += 2;
  978. X                if (*++s == '\\')
  979. X                ++k;
  980. X            }
  981. X            }
  982. X            j += k;
  983. X            if (j > 80)
  984. X            {
  985. X            if (!rflag) ++outline;
  986. X            putc('\n', output_file);
  987. X            j = k;
  988. X            }
  989. X            fprintf(output_file, "\"'");
  990. X            s = symnam[i];
  991. X            while (*++s != '\'')
  992. X            {
  993. X            if (*s == '\\')
  994. X            {
  995. X                fprintf(output_file, "\\\\");
  996. X                if (*++s == '\\')
  997. X                fprintf(output_file, "\\\\");
  998. X                else
  999. X                putc(*s, output_file);
  1000. X            }
  1001. X            else
  1002. X                putc(*s, output_file);
  1003. X            }
  1004. X            fprintf(output_file, "'\",");
  1005. X        }
  1006. X        }
  1007. X        else
  1008. X        {
  1009. X        k = strlen(s) + 3;
  1010. X        j += k;
  1011. X        if (j > 80)
  1012. X        {
  1013. X            if (!rflag) ++outline;
  1014. X            putc('\n', output_file);
  1015. X            j = k;
  1016. X        }
  1017. X        putc('"', output_file);
  1018. X        do { putc(*s, output_file); } while (*++s);
  1019. X        fprintf(output_file, "\",");
  1020. X        }
  1021. X    }
  1022. X    else
  1023. X    {
  1024. X        j += 2;
  1025. X        if (j > 80)
  1026. X        {
  1027. X        if (!rflag) ++outline;
  1028. X        putc('\n', output_file);
  1029. X        j = 2;
  1030. X        }
  1031. X        fprintf(output_file, "0,");
  1032. X    }
  1033. X    }
  1034. X    if (!rflag) outline += 2;
  1035. X    fprintf(output_file, "\n};\n");
  1036. X    FREE(symnam);
  1037. X
  1038. X    if (!rflag) ++outline;
  1039. X    fprintf(output_file, "char *%srule[] = {\n", symbol_prefix);
  1040. X    for (i = 2; i < nrules; ++i)
  1041. X    {
  1042. X    fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]);
  1043. X    for (j = rrhs[i]; ritem[j] > 0; ++j)
  1044. X    {
  1045. X        s = symbol_name[ritem[j]];
  1046. X        if (s[0] == '"')
  1047. X        {
  1048. X        fprintf(output_file, " \\\"");
  1049. X        while (*++s != '"')
  1050. X        {
  1051. X            if (*s == '\\')
  1052. X            {
  1053. X            if (s[1] == '\\')
  1054. X                fprintf(output_file, "\\\\\\\\");
  1055. X            else
  1056. X                fprintf(output_file, "\\\\%c", s[1]);
  1057. X            ++s;
  1058. X            }
  1059. X            else
  1060. X            putc(*s, output_file);
  1061. X        }
  1062. X        fprintf(output_file, "\\\"");
  1063. X        }
  1064. X        else if (s[0] == '\'')
  1065. X        {
  1066. X        if (s[1] == '"')
  1067. X            fprintf(output_file, " '\\\"'");
  1068. X        else if (s[1] == '\\')
  1069. X        {
  1070. X            if (s[2] == '\\')
  1071. X            fprintf(output_file, " '\\\\\\\\");
  1072. X            else
  1073. X            fprintf(output_file, " '\\\\%c", s[2]);
  1074. X            s += 2;
  1075. X            while (*++s != '\'')
  1076. X            putc(*s, output_file);
  1077. X            putc('\'', output_file);
  1078. X        }
  1079. X        else
  1080. X            fprintf(output_file, " '%c'", s[1]);
  1081. X        }
  1082. X        else
  1083. X        fprintf(output_file, " %s", s);
  1084. X    }
  1085. X    if (!rflag) ++outline;
  1086. X    fprintf(output_file, "\",\n");
  1087. X    }
  1088. X
  1089. X    if (!rflag) outline += 2;
  1090. X    fprintf(output_file, "};\n#endif\n");
  1091. X}
  1092. X
  1093. X
  1094. Xoutput_stype()
  1095. X{
  1096. X    if (!unionized && ntags == 0)
  1097. X    {
  1098. X    outline += 3;
  1099. X    fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n");
  1100. X    }
  1101. X}
  1102. X
  1103. X
  1104. Xoutput_trailing_text()
  1105. X{
  1106. X    register int c, last;
  1107. X    register FILE *in, *out;
  1108. X
  1109. X    if (line == 0)
  1110. X    return;
  1111. X
  1112. X    in = input_file;
  1113. X    out = code_file;
  1114. X    c = *cptr;
  1115. X    if (c == '\n')
  1116. X    {
  1117. X    ++lineno;
  1118. X    if ((c = getc(in)) == EOF)
  1119. X        return;
  1120. X    if (!lflag)
  1121. X    {
  1122. X        ++outline;
  1123. X        fprintf(out, line_format, lineno, input_file_name);
  1124. X    }
  1125. X    if (c == '\n')
  1126. X        ++outline;
  1127. X    putc(c, out);
  1128. X    last = c;
  1129. X    }
  1130. X    else
  1131. X    {
  1132. X    if (!lflag)
  1133. X    {
  1134. X        ++outline;
  1135. X        fprintf(out, line_format, lineno, input_file_name);
  1136. X    }
  1137. X    do { putc(c, out); } while ((c = *++cptr) != '\n');
  1138. X    ++outline;
  1139. X    putc('\n', out);
  1140. X    last = '\n';
  1141. X    }
  1142. X
  1143. X    while ((c = getc(in)) != EOF)
  1144. X    {
  1145. X    if (c == '\n')
  1146. X        ++outline;
  1147. X    putc(c, out);
  1148. X    last = c;
  1149. X    }
  1150. X
  1151. X    if (last != '\n')
  1152. X    {
  1153. X    ++outline;
  1154. X    putc('\n', out);
  1155. X    }
  1156. X    if (!lflag)
  1157. X    fprintf(out, line_format, ++outline + 1, code_file_name);
  1158. X}
  1159. X
  1160. X
  1161. Xoutput_semantic_actions()
  1162. X{
  1163. X    register int c, last;
  1164. X    register FILE *out;
  1165. X
  1166. X    fclose(action_file);
  1167. X    action_file = fopen(action_file_name, "r");
  1168. X    if (action_file == NULL)
  1169. X    open_error(action_file_name);
  1170. X
  1171. X    if ((c = getc(action_file)) == EOF)
  1172. X    return;
  1173. X
  1174. X    out = code_file;
  1175. X    last = c;
  1176. X    if (c == '\n')
  1177. X    ++outline;
  1178. X    putc(c, out);
  1179. X    while ((c = getc(action_file)) != EOF)
  1180. X    {
  1181. X    if (c == '\n')
  1182. X        ++outline;
  1183. X    putc(c, out);
  1184. X    last = c;
  1185. X    }
  1186. X
  1187. X    if (last != '\n')
  1188. X    {
  1189. X    ++outline;
  1190. X    putc('\n', out);
  1191. X    }
  1192. X
  1193. X    if (!lflag)
  1194. X    fprintf(out, line_format, ++outline + 1, code_file_name);
  1195. X}
  1196. X
  1197. X
  1198. Xfree_itemsets()
  1199. X{
  1200. X    register core *cp, *next;
  1201. X
  1202. X    FREE(state_table);
  1203. X    for (cp = first_state; cp; cp = next)
  1204. X    {
  1205. X    next = cp->next;
  1206. X    FREE(cp);
  1207. X    }
  1208. X}
  1209. X
  1210. X
  1211. Xfree_shifts()
  1212. X{
  1213. X    register shifts *sp, *next;
  1214. X
  1215. X    FREE(shift_table);
  1216. X    for (sp = first_shift; sp; sp = next)
  1217. X    {
  1218. X    next = sp->next;
  1219. X    FREE(sp);
  1220. X    }
  1221. X}
  1222. X
  1223. X
  1224. X
  1225. Xfree_reductions()
  1226. X{
  1227. X    register reductions *rp, *next;
  1228. X
  1229. X    FREE(reduction_table);
  1230. X    for (rp = first_reduction; rp; rp = next)
  1231. X    {
  1232. X    next = rp->next;
  1233. X    FREE(rp);
  1234. X    }
  1235. X}
  1236. END_OF_FILE
  1237. if test 22710 -ne `wc -c <'output.c'`; then
  1238.     echo shar: \"'output.c'\" unpacked with wrong size!
  1239. fi
  1240. # end of 'output.c'
  1241. fi
  1242. if test -f 'test/ftp.output' -a "${1}" != "-c" ; then 
  1243.   echo shar: Will not clobber existing file \"'test/ftp.output'\"
  1244. else
  1245. echo shar: Extracting \"'test/ftp.output'\" \(22197 characters\)
  1246. sed "s/^X//" >'test/ftp.output' <<'END_OF_FILE'
  1247. X   0  $accept : cmd_list $end
  1248. X
  1249. X   1  cmd_list :
  1250. X   2           | cmd_list cmd
  1251. X   3           | cmd_list rcmd
  1252. X
  1253. X   4  cmd : USER SP username CRLF
  1254. X   5      | PASS SP password CRLF
  1255. X   6      | PORT SP host_port CRLF
  1256. X   7      | PASV CRLF
  1257. X   8      | TYPE SP type_code CRLF
  1258. X   9      | STRU SP struct_code CRLF
  1259. X  10      | MODE SP mode_code CRLF
  1260. X  11      | ALLO SP NUMBER CRLF
  1261. X  12      | ALLO SP NUMBER SP R SP NUMBER CRLF
  1262. X  13      | RETR check_login SP pathname CRLF
  1263. X  14      | STOR check_login SP pathname CRLF
  1264. X  15      | APPE check_login SP pathname CRLF
  1265. X  16      | NLST check_login CRLF
  1266. X  17      | NLST check_login SP STRING CRLF
  1267. X  18      | LIST check_login CRLF
  1268. X  19      | LIST check_login SP pathname CRLF
  1269. X  20      | STAT check_login SP pathname CRLF
  1270. X  21      | STAT CRLF
  1271. X  22      | DELE check_login SP pathname CRLF
  1272. X  23      | RNTO SP pathname CRLF
  1273. X  24      | ABOR CRLF
  1274. X  25      | CWD check_login CRLF
  1275. X  26      | CWD check_login SP pathname CRLF
  1276. X  27      | HELP CRLF
  1277. X  28      | HELP SP STRING CRLF
  1278. X  29      | NOOP CRLF
  1279. X  30      | MKD check_login SP pathname CRLF
  1280. X  31      | RMD check_login SP pathname CRLF
  1281. X  32      | PWD check_login CRLF
  1282. X  33      | CDUP check_login CRLF
  1283. X  34      | SITE SP HELP CRLF
  1284. X  35      | SITE SP HELP SP STRING CRLF
  1285. X  36      | SITE SP UMASK check_login CRLF
  1286. X  37      | SITE SP UMASK check_login SP octal_number CRLF
  1287. X  38      | SITE SP CHMOD check_login SP octal_number SP pathname CRLF
  1288. X  39      | SITE SP IDLE CRLF
  1289. X  40      | SITE SP IDLE SP NUMBER CRLF
  1290. X  41      | STOU check_login SP pathname CRLF
  1291. X  42      | SYST CRLF
  1292. X  43      | SIZE check_login SP pathname CRLF
  1293. X  44      | MDTM check_login SP pathname CRLF
  1294. X  45      | QUIT CRLF
  1295. X  46      | error CRLF
  1296. X
  1297. X  47  rcmd : RNFR check_login SP pathname CRLF
  1298. X
  1299. X  48  username : STRING
  1300. X
  1301. X  49  password :
  1302. X  50           | STRING
  1303. X
  1304. X  51  byte_size : NUMBER
  1305. X
  1306. X  52  host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER
  1307. X
  1308. X  53  form_code : N
  1309. X  54            | T
  1310. X  55            | C
  1311. X
  1312. X  56  type_code : A
  1313. X  57            | A SP form_code
  1314. X  58            | E
  1315. X  59            | E SP form_code
  1316. X  60            | I
  1317. X  61            | L
  1318. X  62            | L SP byte_size
  1319. X  63            | L byte_size
  1320. X
  1321. X  64  struct_code : F
  1322. X  65              | R
  1323. X  66              | P
  1324. X
  1325. X  67  mode_code : S
  1326. X  68            | B
  1327. X  69            | C
  1328. X
  1329. X  70  pathname : pathstring
  1330. X
  1331. X  71  pathstring : STRING
  1332. X
  1333. X  72  octal_number : NUMBER
  1334. X
  1335. X  73  check_login :
  1336. X
  1337. Xstate 0
  1338. X    $accept : . cmd_list $end  (0)
  1339. X    cmd_list : .  (1)
  1340. X
  1341. X    .  reduce 1
  1342. X
  1343. X    cmd_list  goto 1
  1344. X
  1345. X
  1346. Xstate 1
  1347. X    $accept : cmd_list . $end  (0)
  1348. X    cmd_list : cmd_list . cmd  (2)
  1349. X    cmd_list : cmd_list . rcmd  (3)
  1350. X
  1351. X    $end  accept
  1352. X    error  shift 2
  1353. X    USER  shift 3
  1354. X    PASS  shift 4
  1355. X    QUIT  shift 5
  1356. X    PORT  shift 6
  1357. X    PASV  shift 7
  1358. X    TYPE  shift 8
  1359. X    STRU  shift 9
  1360. X    MODE  shift 10
  1361. X    RETR  shift 11
  1362. X    STOR  shift 12
  1363. X    APPE  shift 13
  1364. X    ALLO  shift 14
  1365. X    RNFR  shift 15
  1366. X    RNTO  shift 16
  1367. X    ABOR  shift 17
  1368. X    DELE  shift 18
  1369. X    CWD  shift 19
  1370. X    LIST  shift 20
  1371. X    NLST  shift 21
  1372. X    SITE  shift 22
  1373. X    STAT  shift 23
  1374. X    HELP  shift 24
  1375. X    NOOP  shift 25
  1376. X    MKD  shift 26
  1377. X    RMD  shift 27
  1378. X    PWD  shift 28
  1379. X    CDUP  shift 29
  1380. X    STOU  shift 30
  1381. X    SYST  shift 31
  1382. X    SIZE  shift 32
  1383. X    MDTM  shift 33
  1384. X    .  error
  1385. X
  1386. X    cmd  goto 34
  1387. X    rcmd  goto 35
  1388. X
  1389. X
  1390. Xstate 2
  1391. X    cmd : error . CRLF  (46)
  1392. X
  1393. X    CRLF  shift 36
  1394. X    .  error
  1395. X
  1396. X
  1397. Xstate 3
  1398. X    cmd : USER . SP username CRLF  (4)
  1399. X
  1400. X    SP  shift 37
  1401. X    .  error
  1402. X
  1403. X
  1404. Xstate 4
  1405. X    cmd : PASS . SP password CRLF  (5)
  1406. X
  1407. X    SP  shift 38
  1408. X    .  error
  1409. X
  1410. X
  1411. Xstate 5
  1412. X    cmd : QUIT . CRLF  (45)
  1413. X
  1414. X    CRLF  shift 39
  1415. X    .  error
  1416. X
  1417. X
  1418. Xstate 6
  1419. X    cmd : PORT . SP host_port CRLF  (6)
  1420. X
  1421. X    SP  shift 40
  1422. X    .  error
  1423. X
  1424. X
  1425. Xstate 7
  1426. X    cmd : PASV . CRLF  (7)
  1427. X
  1428. X    CRLF  shift 41
  1429. X    .  error
  1430. X
  1431. X
  1432. Xstate 8
  1433. X    cmd : TYPE . SP type_code CRLF  (8)
  1434. X
  1435. X    SP  shift 42
  1436. X    .  error
  1437. X
  1438. X
  1439. Xstate 9
  1440. X    cmd : STRU . SP struct_code CRLF  (9)
  1441. X
  1442. X    SP  shift 43
  1443. X    .  error
  1444. X
  1445. X
  1446. Xstate 10
  1447. X    cmd : MODE . SP mode_code CRLF  (10)
  1448. X
  1449. X    SP  shift 44
  1450. X    .  error
  1451. X
  1452. X
  1453. Xstate 11
  1454. X    cmd : RETR . check_login SP pathname CRLF  (13)
  1455. X    check_login : .  (73)
  1456. X
  1457. X    .  reduce 73
  1458. X
  1459. X    check_login  goto 45
  1460. X
  1461. X
  1462. Xstate 12
  1463. X    cmd : STOR . check_login SP pathname CRLF  (14)
  1464. X    check_login : .  (73)
  1465. X
  1466. X    .  reduce 73
  1467. X
  1468. X    check_login  goto 46
  1469. X
  1470. X
  1471. Xstate 13
  1472. X    cmd : APPE . check_login SP pathname CRLF  (15)
  1473. X    check_login : .  (73)
  1474. X
  1475. X    .  reduce 73
  1476. X
  1477. X    check_login  goto 47
  1478. X
  1479. X
  1480. Xstate 14
  1481. X    cmd : ALLO . SP NUMBER CRLF  (11)
  1482. X    cmd : ALLO . SP NUMBER SP R SP NUMBER CRLF  (12)
  1483. X
  1484. X    SP  shift 48
  1485. X    .  error
  1486. X
  1487. X
  1488. Xstate 15
  1489. X    rcmd : RNFR . check_login SP pathname CRLF  (47)
  1490. X    check_login : .  (73)
  1491. X
  1492. X    .  reduce 73
  1493. X
  1494. X    check_login  goto 49
  1495. X
  1496. X
  1497. Xstate 16
  1498. X    cmd : RNTO . SP pathname CRLF  (23)
  1499. X
  1500. X    SP  shift 50
  1501. X    .  error
  1502. X
  1503. X
  1504. Xstate 17
  1505. X    cmd : ABOR . CRLF  (24)
  1506. X
  1507. X    CRLF  shift 51
  1508. X    .  error
  1509. X
  1510. X
  1511. Xstate 18
  1512. X    cmd : DELE . check_login SP pathname CRLF  (22)
  1513. X    check_login : .  (73)
  1514. X
  1515. X    .  reduce 73
  1516. X
  1517. X    check_login  goto 52
  1518. X
  1519. X
  1520. Xstate 19
  1521. X    cmd : CWD . check_login CRLF  (25)
  1522. X    cmd : CWD . check_login SP pathname CRLF  (26)
  1523. X    check_login : .  (73)
  1524. X
  1525. X    .  reduce 73
  1526. X
  1527. X    check_login  goto 53
  1528. X
  1529. X
  1530. Xstate 20
  1531. X    cmd : LIST . check_login CRLF  (18)
  1532. X    cmd : LIST . check_login SP pathname CRLF  (19)
  1533. X    check_login : .  (73)
  1534. X
  1535. X    .  reduce 73
  1536. X
  1537. X    check_login  goto 54
  1538. X
  1539. X
  1540. Xstate 21
  1541. X    cmd : NLST . check_login CRLF  (16)
  1542. X    cmd : NLST . check_login SP STRING CRLF  (17)
  1543. X    check_login : .  (73)
  1544. X
  1545. X    .  reduce 73
  1546. X
  1547. X    check_login  goto 55
  1548. X
  1549. X
  1550. Xstate 22
  1551. X    cmd : SITE . SP HELP CRLF  (34)
  1552. X    cmd : SITE . SP HELP SP STRING CRLF  (35)
  1553. X    cmd : SITE . SP UMASK check_login CRLF  (36)
  1554. X    cmd : SITE . SP UMASK check_login SP octal_number CRLF  (37)
  1555. X    cmd : SITE . SP CHMOD check_login SP octal_number SP pathname CRLF  (38)
  1556. X    cmd : SITE . SP IDLE CRLF  (39)
  1557. X    cmd : SITE . SP IDLE SP NUMBER CRLF  (40)
  1558. X
  1559. X    SP  shift 56
  1560. X    .  error
  1561. X
  1562. X
  1563. Xstate 23
  1564. X    cmd : STAT . check_login SP pathname CRLF  (20)
  1565. X    cmd : STAT . CRLF  (21)
  1566. X    check_login : .  (73)
  1567. X
  1568. X    CRLF  shift 57
  1569. X    SP  reduce 73
  1570. X
  1571. X    check_login  goto 58
  1572. X
  1573. X
  1574. Xstate 24
  1575. X    cmd : HELP . CRLF  (27)
  1576. X    cmd : HELP . SP STRING CRLF  (28)
  1577. X
  1578. X    SP  shift 59
  1579. X    CRLF  shift 60
  1580. X    .  error
  1581. X
  1582. X
  1583. Xstate 25
  1584. X    cmd : NOOP . CRLF  (29)
  1585. X
  1586. X    CRLF  shift 61
  1587. X    .  error
  1588. X
  1589. X
  1590. Xstate 26
  1591. X    cmd : MKD . check_login SP pathname CRLF  (30)
  1592. X    check_login : .  (73)
  1593. X
  1594. X    .  reduce 73
  1595. X
  1596. X    check_login  goto 62
  1597. X
  1598. X
  1599. Xstate 27
  1600. X    cmd : RMD . check_login SP pathname CRLF  (31)
  1601. X    check_login : .  (73)
  1602. X
  1603. X    .  reduce 73
  1604. X
  1605. X    check_login  goto 63
  1606. X
  1607. X
  1608. Xstate 28
  1609. X    cmd : PWD . check_login CRLF  (32)
  1610. X    check_login : .  (73)
  1611. X
  1612. X    .  reduce 73
  1613. X
  1614. X    check_login  goto 64
  1615. X
  1616. X
  1617. Xstate 29
  1618. X    cmd : CDUP . check_login CRLF  (33)
  1619. X    check_login : .  (73)
  1620. X
  1621. X    .  reduce 73
  1622. X
  1623. X    check_login  goto 65
  1624. X
  1625. X
  1626. Xstate 30
  1627. X    cmd : STOU . check_login SP pathname CRLF  (41)
  1628. X    check_login : .  (73)
  1629. X
  1630. X    .  reduce 73
  1631. X
  1632. X    check_login  goto 66
  1633. X
  1634. X
  1635. Xstate 31
  1636. X    cmd : SYST . CRLF  (42)
  1637. X
  1638. X    CRLF  shift 67
  1639. X    .  error
  1640. X
  1641. X
  1642. Xstate 32
  1643. X    cmd : SIZE . check_login SP pathname CRLF  (43)
  1644. X    check_login : .  (73)
  1645. X
  1646. X    .  reduce 73
  1647. X
  1648. X    check_login  goto 68
  1649. X
  1650. X
  1651. Xstate 33
  1652. X    cmd : MDTM . check_login SP pathname CRLF  (44)
  1653. X    check_login : .  (73)
  1654. X
  1655. X    .  reduce 73
  1656. X
  1657. X    check_login  goto 69
  1658. X
  1659. X
  1660. Xstate 34
  1661. X    cmd_list : cmd_list cmd .  (2)
  1662. X
  1663. X    .  reduce 2
  1664. X
  1665. X
  1666. Xstate 35
  1667. X    cmd_list : cmd_list rcmd .  (3)
  1668. X
  1669. X    .  reduce 3
  1670. X
  1671. X
  1672. Xstate 36
  1673. X    cmd : error CRLF .  (46)
  1674. X
  1675. X    .  reduce 46
  1676. X
  1677. X
  1678. Xstate 37
  1679. X    cmd : USER SP . username CRLF  (4)
  1680. X
  1681. X    STRING  shift 70
  1682. X    .  error
  1683. X
  1684. X    username  goto 71
  1685. X
  1686. X
  1687. Xstate 38
  1688. X    cmd : PASS SP . password CRLF  (5)
  1689. X    password : .  (49)
  1690. X
  1691. X    STRING  shift 72
  1692. X    CRLF  reduce 49
  1693. X
  1694. X    password  goto 73
  1695. X
  1696. X
  1697. Xstate 39
  1698. X    cmd : QUIT CRLF .  (45)
  1699. X
  1700. X    .  reduce 45
  1701. X
  1702. X
  1703. Xstate 40
  1704. X    cmd : PORT SP . host_port CRLF  (6)
  1705. X
  1706. X    NUMBER  shift 74
  1707. X    .  error
  1708. X
  1709. X    host_port  goto 75
  1710. X
  1711. X
  1712. Xstate 41
  1713. X    cmd : PASV CRLF .  (7)
  1714. X
  1715. X    .  reduce 7
  1716. X
  1717. X
  1718. Xstate 42
  1719. X    cmd : TYPE SP . type_code CRLF  (8)
  1720. X
  1721. X    A  shift 76
  1722. X    E  shift 77
  1723. X    I  shift 78
  1724. X    L  shift 79
  1725. X    .  error
  1726. X
  1727. X    type_code  goto 80
  1728. X
  1729. X
  1730. Xstate 43
  1731. X    cmd : STRU SP . struct_code CRLF  (9)
  1732. X
  1733. X    F  shift 81
  1734. X    P  shift 82
  1735. X    R  shift 83
  1736. X    .  error
  1737. X
  1738. X    struct_code  goto 84
  1739. X
  1740. X
  1741. Xstate 44
  1742. X    cmd : MODE SP . mode_code CRLF  (10)
  1743. X
  1744. X    B  shift 85
  1745. X    C  shift 86
  1746. X    S  shift 87
  1747. X    .  error
  1748. X
  1749. X    mode_code  goto 88
  1750. X
  1751. X
  1752. Xstate 45
  1753. X    cmd : RETR check_login . SP pathname CRLF  (13)
  1754. X
  1755. X    SP  shift 89
  1756. X    .  error
  1757. X
  1758. X
  1759. Xstate 46
  1760. X    cmd : STOR check_login . SP pathname CRLF  (14)
  1761. X
  1762. X    SP  shift 90
  1763. X    .  error
  1764. X
  1765. X
  1766. Xstate 47
  1767. X    cmd : APPE check_login . SP pathname CRLF  (15)
  1768. X
  1769. X    SP  shift 91
  1770. X    .  error
  1771. X
  1772. X
  1773. Xstate 48
  1774. X    cmd : ALLO SP . NUMBER CRLF  (11)
  1775. X    cmd : ALLO SP . NUMBER SP R SP NUMBER CRLF  (12)
  1776. X
  1777. X    NUMBER  shift 92
  1778. X    .  error
  1779. X
  1780. X
  1781. Xstate 49
  1782. X    rcmd : RNFR check_login . SP pathname CRLF  (47)
  1783. X
  1784. X    SP  shift 93
  1785. X    .  error
  1786. X
  1787. X
  1788. Xstate 50
  1789. X    cmd : RNTO SP . pathname CRLF  (23)
  1790. X
  1791. X    STRING  shift 94
  1792. X    .  error
  1793. X
  1794. X    pathname  goto 95
  1795. X    pathstring  goto 96
  1796. X
  1797. X
  1798. Xstate 51
  1799. X    cmd : ABOR CRLF .  (24)
  1800. X
  1801. X    .  reduce 24
  1802. X
  1803. X
  1804. Xstate 52
  1805. X    cmd : DELE check_login . SP pathname CRLF  (22)
  1806. X
  1807. X    SP  shift 97
  1808. X    .  error
  1809. X
  1810. X
  1811. Xstate 53
  1812. X    cmd : CWD check_login . CRLF  (25)
  1813. X    cmd : CWD check_login . SP pathname CRLF  (26)
  1814. X
  1815. X    SP  shift 98
  1816. X    CRLF  shift 99
  1817. X    .  error
  1818. X
  1819. X
  1820. Xstate 54
  1821. X    cmd : LIST check_login . CRLF  (18)
  1822. X    cmd : LIST check_login . SP pathname CRLF  (19)
  1823. X
  1824. X    SP  shift 100
  1825. X    CRLF  shift 101
  1826. X    .  error
  1827. X
  1828. X
  1829. Xstate 55
  1830. X    cmd : NLST check_login . CRLF  (16)
  1831. X    cmd : NLST check_login . SP STRING CRLF  (17)
  1832. X
  1833. X    SP  shift 102
  1834. X    CRLF  shift 103
  1835. X    .  error
  1836. X
  1837. X
  1838. Xstate 56
  1839. X    cmd : SITE SP . HELP CRLF  (34)
  1840. X    cmd : SITE SP . HELP SP STRING CRLF  (35)
  1841. X    cmd : SITE SP . UMASK check_login CRLF  (36)
  1842. X    cmd : SITE SP . UMASK check_login SP octal_number CRLF  (37)
  1843. X    cmd : SITE SP . CHMOD check_login SP octal_number SP pathname CRLF  (38)
  1844. X    cmd : SITE SP . IDLE CRLF  (39)
  1845. X    cmd : SITE SP . IDLE SP NUMBER CRLF  (40)
  1846. X
  1847. X    HELP  shift 104
  1848. X    UMASK  shift 105
  1849. X    IDLE  shift 106
  1850. X    CHMOD  shift 107
  1851. X    .  error
  1852. X
  1853. X
  1854. Xstate 57
  1855. X    cmd : STAT CRLF .  (21)
  1856. X
  1857. X    .  reduce 21
  1858. X
  1859. X
  1860. Xstate 58
  1861. X    cmd : STAT check_login . SP pathname CRLF  (20)
  1862. X
  1863. X    SP  shift 108
  1864. X    .  error
  1865. X
  1866. X
  1867. Xstate 59
  1868. X    cmd : HELP SP . STRING CRLF  (28)
  1869. X
  1870. X    STRING  shift 109
  1871. X    .  error
  1872. X
  1873. X
  1874. Xstate 60
  1875. X    cmd : HELP CRLF .  (27)
  1876. X
  1877. X    .  reduce 27
  1878. X
  1879. X
  1880. Xstate 61
  1881. X    cmd : NOOP CRLF .  (29)
  1882. X
  1883. X    .  reduce 29
  1884. X
  1885. X
  1886. Xstate 62
  1887. X    cmd : MKD check_login . SP pathname CRLF  (30)
  1888. X
  1889. X    SP  shift 110
  1890. X    .  error
  1891. X
  1892. X
  1893. Xstate 63
  1894. X    cmd : RMD check_login . SP pathname CRLF  (31)
  1895. X
  1896. X    SP  shift 111
  1897. X    .  error
  1898. X
  1899. X
  1900. Xstate 64
  1901. X    cmd : PWD check_login . CRLF  (32)
  1902. X
  1903. X    CRLF  shift 112
  1904. X    .  error
  1905. X
  1906. X
  1907. Xstate 65
  1908. X    cmd : CDUP check_login . CRLF  (33)
  1909. X
  1910. X    CRLF  shift 113
  1911. X    .  error
  1912. X
  1913. X
  1914. Xstate 66
  1915. X    cmd : STOU check_login . SP pathname CRLF  (41)
  1916. X
  1917. X    SP  shift 114
  1918. X    .  error
  1919. X
  1920. X
  1921. Xstate 67
  1922. X    cmd : SYST CRLF .  (42)
  1923. X
  1924. X    .  reduce 42
  1925. X
  1926. X
  1927. Xstate 68
  1928. X    cmd : SIZE check_login . SP pathname CRLF  (43)
  1929. X
  1930. X    SP  shift 115
  1931. X    .  error
  1932. X
  1933. X
  1934. Xstate 69
  1935. X    cmd : MDTM check_login . SP pathname CRLF  (44)
  1936. X
  1937. X    SP  shift 116
  1938. X    .  error
  1939. X
  1940. X
  1941. Xstate 70
  1942. X    username : STRING .  (48)
  1943. X
  1944. X    .  reduce 48
  1945. X
  1946. X
  1947. Xstate 71
  1948. X    cmd : USER SP username . CRLF  (4)
  1949. X
  1950. X    CRLF  shift 117
  1951. X    .  error
  1952. X
  1953. X
  1954. Xstate 72
  1955. X    password : STRING .  (50)
  1956. X
  1957. X    .  reduce 50
  1958. X
  1959. X
  1960. Xstate 73
  1961. X    cmd : PASS SP password . CRLF  (5)
  1962. X
  1963. X    CRLF  shift 118
  1964. X    .  error
  1965. X
  1966. X
  1967. Xstate 74
  1968. X    host_port : NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER  (52)
  1969. X
  1970. X    COMMA  shift 119
  1971. X    .  error
  1972. X
  1973. X
  1974. Xstate 75
  1975. X    cmd : PORT SP host_port . CRLF  (6)
  1976. X
  1977. X    CRLF  shift 120
  1978. X    .  error
  1979. X
  1980. X
  1981. Xstate 76
  1982. X    type_code : A .  (56)
  1983. X    type_code : A . SP form_code  (57)
  1984. X
  1985. X    SP  shift 121
  1986. X    CRLF  reduce 56
  1987. X
  1988. X
  1989. Xstate 77
  1990. X    type_code : E .  (58)
  1991. X    type_code : E . SP form_code  (59)
  1992. X
  1993. X    SP  shift 122
  1994. X    CRLF  reduce 58
  1995. X
  1996. X
  1997. Xstate 78
  1998. X    type_code : I .  (60)
  1999. X
  2000. X    .  reduce 60
  2001. X
  2002. X
  2003. Xstate 79
  2004. X    type_code : L .  (61)
  2005. X    type_code : L . SP byte_size  (62)
  2006. X    type_code : L . byte_size  (63)
  2007. X
  2008. X    SP  shift 123
  2009. X    NUMBER  shift 124
  2010. X    CRLF  reduce 61
  2011. X
  2012. X    byte_size  goto 125
  2013. X
  2014. X
  2015. Xstate 80
  2016. X    cmd : TYPE SP type_code . CRLF  (8)
  2017. X
  2018. X    CRLF  shift 126
  2019. X    .  error
  2020. X
  2021. X
  2022. Xstate 81
  2023. X    struct_code : F .  (64)
  2024. X
  2025. X    .  reduce 64
  2026. X
  2027. X
  2028. Xstate 82
  2029. X    struct_code : P .  (66)
  2030. X
  2031. X    .  reduce 66
  2032. X
  2033. X
  2034. Xstate 83
  2035. X    struct_code : R .  (65)
  2036. X
  2037. X    .  reduce 65
  2038. X
  2039. X
  2040. Xstate 84
  2041. X    cmd : STRU SP struct_code . CRLF  (9)
  2042. X
  2043. X    CRLF  shift 127
  2044. X    .  error
  2045. X
  2046. X
  2047. Xstate 85
  2048. X    mode_code : B .  (68)
  2049. X
  2050. X    .  reduce 68
  2051. X
  2052. X
  2053. Xstate 86
  2054. X    mode_code : C .  (69)
  2055. X
  2056. X    .  reduce 69
  2057. X
  2058. X
  2059. Xstate 87
  2060. X    mode_code : S .  (67)
  2061. X
  2062. X    .  reduce 67
  2063. X
  2064. X
  2065. Xstate 88
  2066. X    cmd : MODE SP mode_code . CRLF  (10)
  2067. X
  2068. X    CRLF  shift 128
  2069. X    .  error
  2070. X
  2071. X
  2072. Xstate 89
  2073. X    cmd : RETR check_login SP . pathname CRLF  (13)
  2074. X
  2075. X    STRING  shift 94
  2076. X    .  error
  2077. X
  2078. X    pathname  goto 129
  2079. X    pathstring  goto 96
  2080. X
  2081. X
  2082. Xstate 90
  2083. X    cmd : STOR check_login SP . pathname CRLF  (14)
  2084. X
  2085. X    STRING  shift 94
  2086. X    .  error
  2087. X
  2088. X    pathname  goto 130
  2089. X    pathstring  goto 96
  2090. X
  2091. X
  2092. Xstate 91
  2093. X    cmd : APPE check_login SP . pathname CRLF  (15)
  2094. X
  2095. X    STRING  shift 94
  2096. X    .  error
  2097. X
  2098. X    pathname  goto 131
  2099. X    pathstring  goto 96
  2100. X
  2101. X
  2102. Xstate 92
  2103. X    cmd : ALLO SP NUMBER . CRLF  (11)
  2104. X    cmd : ALLO SP NUMBER . SP R SP NUMBER CRLF  (12)
  2105. X
  2106. X    SP  shift 132
  2107. X    CRLF  shift 133
  2108. X    .  error
  2109. X
  2110. X
  2111. Xstate 93
  2112. X    rcmd : RNFR check_login SP . pathname CRLF  (47)
  2113. X
  2114. X    STRING  shift 94
  2115. X    .  error
  2116. X
  2117. X    pathname  goto 134
  2118. X    pathstring  goto 96
  2119. X
  2120. X
  2121. Xstate 94
  2122. X    pathstring : STRING .  (71)
  2123. X
  2124. X    .  reduce 71
  2125. X
  2126. X
  2127. Xstate 95
  2128. X    cmd : RNTO SP pathname . CRLF  (23)
  2129. X
  2130. X    CRLF  shift 135
  2131. X    .  error
  2132. X
  2133. X
  2134. Xstate 96
  2135. X    pathname : pathstring .  (70)
  2136. X
  2137. X    .  reduce 70
  2138. X
  2139. X
  2140. Xstate 97
  2141. X    cmd : DELE check_login SP . pathname CRLF  (22)
  2142. X
  2143. X    STRING  shift 94
  2144. X    .  error
  2145. X
  2146. X    pathname  goto 136
  2147. X    pathstring  goto 96
  2148. X
  2149. X
  2150. Xstate 98
  2151. X    cmd : CWD check_login SP . pathname CRLF  (26)
  2152. X
  2153. X    STRING  shift 94
  2154. X    .  error
  2155. X
  2156. X    pathname  goto 137
  2157. X    pathstring  goto 96
  2158. X
  2159. X
  2160. Xstate 99
  2161. X    cmd : CWD check_login CRLF .  (25)
  2162. X
  2163. X    .  reduce 25
  2164. X
  2165. X
  2166. Xstate 100
  2167. X    cmd : LIST check_login SP . pathname CRLF  (19)
  2168. X
  2169. X    STRING  shift 94
  2170. X    .  error
  2171. X
  2172. X    pathname  goto 138
  2173. X    pathstring  goto 96
  2174. X
  2175. X
  2176. Xstate 101
  2177. X    cmd : LIST check_login CRLF .  (18)
  2178. X
  2179. X    .  reduce 18
  2180. X
  2181. X
  2182. Xstate 102
  2183. X    cmd : NLST check_login SP . STRING CRLF  (17)
  2184. X
  2185. X    STRING  shift 139
  2186. X    .  error
  2187. X
  2188. X
  2189. Xstate 103
  2190. X    cmd : NLST check_login CRLF .  (16)
  2191. X
  2192. X    .  reduce 16
  2193. X
  2194. X
  2195. Xstate 104
  2196. X    cmd : SITE SP HELP . CRLF  (34)
  2197. X    cmd : SITE SP HELP . SP STRING CRLF  (35)
  2198. X
  2199. X    SP  shift 140
  2200. X    CRLF  shift 141
  2201. X    .  error
  2202. X
  2203. X
  2204. Xstate 105
  2205. X    cmd : SITE SP UMASK . check_login CRLF  (36)
  2206. X    cmd : SITE SP UMASK . check_login SP octal_number CRLF  (37)
  2207. X    check_login : .  (73)
  2208. X
  2209. X    .  reduce 73
  2210. X
  2211. X    check_login  goto 142
  2212. X
  2213. X
  2214. Xstate 106
  2215. X    cmd : SITE SP IDLE . CRLF  (39)
  2216. X    cmd : SITE SP IDLE . SP NUMBER CRLF  (40)
  2217. X
  2218. X    SP  shift 143
  2219. X    CRLF  shift 144
  2220. X    .  error
  2221. X
  2222. X
  2223. Xstate 107
  2224. X    cmd : SITE SP CHMOD . check_login SP octal_number SP pathname CRLF  (38)
  2225. X    check_login : .  (73)
  2226. X
  2227. X    .  reduce 73
  2228. X
  2229. X    check_login  goto 145
  2230. X
  2231. X
  2232. Xstate 108
  2233. X    cmd : STAT check_login SP . pathname CRLF  (20)
  2234. X
  2235. X    STRING  shift 94
  2236. X    .  error
  2237. X
  2238. X    pathname  goto 146
  2239. X    pathstring  goto 96
  2240. X
  2241. X
  2242. Xstate 109
  2243. X    cmd : HELP SP STRING . CRLF  (28)
  2244. X
  2245. X    CRLF  shift 147
  2246. X    .  error
  2247. X
  2248. X
  2249. Xstate 110
  2250. X    cmd : MKD check_login SP . pathname CRLF  (30)
  2251. X
  2252. X    STRING  shift 94
  2253. X    .  error
  2254. X
  2255. X    pathname  goto 148
  2256. X    pathstring  goto 96
  2257. X
  2258. X
  2259. Xstate 111
  2260. X    cmd : RMD check_login SP . pathname CRLF  (31)
  2261. X
  2262. X    STRING  shift 94
  2263. X    .  error
  2264. X
  2265. X    pathname  goto 149
  2266. X    pathstring  goto 96
  2267. X
  2268. X
  2269. Xstate 112
  2270. X    cmd : PWD check_login CRLF .  (32)
  2271. X
  2272. X    .  reduce 32
  2273. X
  2274. X
  2275. Xstate 113
  2276. X    cmd : CDUP check_login CRLF .  (33)
  2277. X
  2278. X    .  reduce 33
  2279. X
  2280. X
  2281. Xstate 114
  2282. X    cmd : STOU check_login SP . pathname CRLF  (41)
  2283. X
  2284. X    STRING  shift 94
  2285. X    .  error
  2286. X
  2287. X    pathname  goto 150
  2288. X    pathstring  goto 96
  2289. X
  2290. X
  2291. Xstate 115
  2292. X    cmd : SIZE check_login SP . pathname CRLF  (43)
  2293. X
  2294. X    STRING  shift 94
  2295. X    .  error
  2296. X
  2297. X    pathname  goto 151
  2298. X    pathstring  goto 96
  2299. X
  2300. X
  2301. Xstate 116
  2302. X    cmd : MDTM check_login SP . pathname CRLF  (44)
  2303. X
  2304. X    STRING  shift 94
  2305. X    .  error
  2306. X
  2307. X    pathname  goto 152
  2308. X    pathstring  goto 96
  2309. X
  2310. X
  2311. Xstate 117
  2312. X    cmd : USER SP username CRLF .  (4)
  2313. X
  2314. X    .  reduce 4
  2315. X
  2316. X
  2317. Xstate 118
  2318. X    cmd : PASS SP password CRLF .  (5)
  2319. X
  2320. X    .  reduce 5
  2321. X
  2322. X
  2323. Xstate 119
  2324. X    host_port : NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER  (52)
  2325. X
  2326. X    NUMBER  shift 153
  2327. X    .  error
  2328. X
  2329. X
  2330. Xstate 120
  2331. X    cmd : PORT SP host_port CRLF .  (6)
  2332. X
  2333. X    .  reduce 6
  2334. X
  2335. X
  2336. Xstate 121
  2337. X    type_code : A SP . form_code  (57)
  2338. X
  2339. X    C  shift 154
  2340. X    N  shift 155
  2341. X    T  shift 156
  2342. X    .  error
  2343. X
  2344. X    form_code  goto 157
  2345. X
  2346. X
  2347. Xstate 122
  2348. X    type_code : E SP . form_code  (59)
  2349. X
  2350. X    C  shift 154
  2351. X    N  shift 155
  2352. X    T  shift 156
  2353. X    .  error
  2354. X
  2355. X    form_code  goto 158
  2356. X
  2357. X
  2358. Xstate 123
  2359. X    type_code : L SP . byte_size  (62)
  2360. X
  2361. X    NUMBER  shift 124
  2362. X    .  error
  2363. X
  2364. X    byte_size  goto 159
  2365. X
  2366. X
  2367. Xstate 124
  2368. X    byte_size : NUMBER .  (51)
  2369. X
  2370. X    .  reduce 51
  2371. X
  2372. X
  2373. Xstate 125
  2374. X    type_code : L byte_size .  (63)
  2375. X
  2376. X    .  reduce 63
  2377. X
  2378. X
  2379. Xstate 126
  2380. X    cmd : TYPE SP type_code CRLF .  (8)
  2381. X
  2382. X    .  reduce 8
  2383. X
  2384. X
  2385. Xstate 127
  2386. X    cmd : STRU SP struct_code CRLF .  (9)
  2387. X
  2388. X    .  reduce 9
  2389. X
  2390. X
  2391. Xstate 128
  2392. X    cmd : MODE SP mode_code CRLF .  (10)
  2393. X
  2394. X    .  reduce 10
  2395. X
  2396. X
  2397. Xstate 129
  2398. X    cmd : RETR check_login SP pathname . CRLF  (13)
  2399. X
  2400. X    CRLF  shift 160
  2401. X    .  error
  2402. X
  2403. X
  2404. Xstate 130
  2405. X    cmd : STOR check_login SP pathname . CRLF  (14)
  2406. X
  2407. X    CRLF  shift 161
  2408. X    .  error
  2409. X
  2410. X
  2411. Xstate 131
  2412. X    cmd : APPE check_login SP pathname . CRLF  (15)
  2413. X
  2414. X    CRLF  shift 162
  2415. X    .  error
  2416. X
  2417. X
  2418. Xstate 132
  2419. X    cmd : ALLO SP NUMBER SP . R SP NUMBER CRLF  (12)
  2420. X
  2421. X    R  shift 163
  2422. X    .  error
  2423. X
  2424. X
  2425. Xstate 133
  2426. X    cmd : ALLO SP NUMBER CRLF .  (11)
  2427. X
  2428. X    .  reduce 11
  2429. X
  2430. X
  2431. Xstate 134
  2432. X    rcmd : RNFR check_login SP pathname . CRLF  (47)
  2433. X
  2434. X    CRLF  shift 164
  2435. X    .  error
  2436. X
  2437. X
  2438. Xstate 135
  2439. X    cmd : RNTO SP pathname CRLF .  (23)
  2440. X
  2441. X    .  reduce 23
  2442. X
  2443. X
  2444. Xstate 136
  2445. X    cmd : DELE check_login SP pathname . CRLF  (22)
  2446. X
  2447. X    CRLF  shift 165
  2448. X    .  error
  2449. X
  2450. X
  2451. Xstate 137
  2452. X    cmd : CWD check_login SP pathname . CRLF  (26)
  2453. X
  2454. X    CRLF  shift 166
  2455. X    .  error
  2456. X
  2457. X
  2458. Xstate 138
  2459. X    cmd : LIST check_login SP pathname . CRLF  (19)
  2460. X
  2461. X    CRLF  shift 167
  2462. X    .  error
  2463. X
  2464. X
  2465. Xstate 139
  2466. X    cmd : NLST check_login SP STRING . CRLF  (17)
  2467. X
  2468. X    CRLF  shift 168
  2469. X    .  error
  2470. X
  2471. X
  2472. Xstate 140
  2473. X    cmd : SITE SP HELP SP . STRING CRLF  (35)
  2474. X
  2475. X    STRING  shift 169
  2476. X    .  error
  2477. X
  2478. X
  2479. Xstate 141
  2480. X    cmd : SITE SP HELP CRLF .  (34)
  2481. X
  2482. X    .  reduce 34
  2483. X
  2484. X
  2485. Xstate 142
  2486. X    cmd : SITE SP UMASK check_login . CRLF  (36)
  2487. X    cmd : SITE SP UMASK check_login . SP octal_number CRLF  (37)
  2488. X
  2489. X    SP  shift 170
  2490. X    CRLF  shift 171
  2491. X    .  error
  2492. X
  2493. X
  2494. Xstate 143
  2495. X    cmd : SITE SP IDLE SP . NUMBER CRLF  (40)
  2496. X
  2497. X    NUMBER  shift 172
  2498. X    .  error
  2499. X
  2500. X
  2501. Xstate 144
  2502. X    cmd : SITE SP IDLE CRLF .  (39)
  2503. X
  2504. X    .  reduce 39
  2505. X
  2506. X
  2507. Xstate 145
  2508. X    cmd : SITE SP CHMOD check_login . SP octal_number SP pathname CRLF  (38)
  2509. X
  2510. X    SP  shift 173
  2511. X    .  error
  2512. X
  2513. X
  2514. Xstate 146
  2515. X    cmd : STAT check_login SP pathname . CRLF  (20)
  2516. X
  2517. X    CRLF  shift 174
  2518. X    .  error
  2519. X
  2520. X
  2521. Xstate 147
  2522. X    cmd : HELP SP STRING CRLF .  (28)
  2523. X
  2524. X    .  reduce 28
  2525. X
  2526. X
  2527. Xstate 148
  2528. X    cmd : MKD check_login SP pathname . CRLF  (30)
  2529. X
  2530. X    CRLF  shift 175
  2531. X    .  error
  2532. X
  2533. X
  2534. Xstate 149
  2535. X    cmd : RMD check_login SP pathname . CRLF  (31)
  2536. X
  2537. X    CRLF  shift 176
  2538. X    .  error
  2539. X
  2540. X
  2541. Xstate 150
  2542. X    cmd : STOU check_login SP pathname . CRLF  (41)
  2543. X
  2544. X    CRLF  shift 177
  2545. X    .  error
  2546. X
  2547. X
  2548. Xstate 151
  2549. X    cmd : SIZE check_login SP pathname . CRLF  (43)
  2550. X
  2551. X    CRLF  shift 178
  2552. X    .  error
  2553. X
  2554. X
  2555. Xstate 152
  2556. X    cmd : MDTM check_login SP pathname . CRLF  (44)
  2557. X
  2558. X    CRLF  shift 179
  2559. X    .  error
  2560. X
  2561. X
  2562. Xstate 153
  2563. X    host_port : NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER  (52)
  2564. X
  2565. X    COMMA  shift 180
  2566. X    .  error
  2567. X
  2568. X
  2569. Xstate 154
  2570. X    form_code : C .  (55)
  2571. X
  2572. X    .  reduce 55
  2573. X
  2574. X
  2575. Xstate 155
  2576. X    form_code : N .  (53)
  2577. X
  2578. X    .  reduce 53
  2579. X
  2580. X
  2581. Xstate 156
  2582. X    form_code : T .  (54)
  2583. X
  2584. X    .  reduce 54
  2585. X
  2586. X
  2587. Xstate 157
  2588. X    type_code : A SP form_code .  (57)
  2589. X
  2590. X    .  reduce 57
  2591. X
  2592. X
  2593. Xstate 158
  2594. X    type_code : E SP form_code .  (59)
  2595. X
  2596. X    .  reduce 59
  2597. X
  2598. X
  2599. Xstate 159
  2600. X    type_code : L SP byte_size .  (62)
  2601. X
  2602. X    .  reduce 62
  2603. X
  2604. X
  2605. Xstate 160
  2606. X    cmd : RETR check_login SP pathname CRLF .  (13)
  2607. X
  2608. X    .  reduce 13
  2609. X
  2610. X
  2611. Xstate 161
  2612. X    cmd : STOR check_login SP pathname CRLF .  (14)
  2613. X
  2614. X    .  reduce 14
  2615. X
  2616. X
  2617. Xstate 162
  2618. X    cmd : APPE check_login SP pathname CRLF .  (15)
  2619. X
  2620. X    .  reduce 15
  2621. X
  2622. X
  2623. Xstate 163
  2624. X    cmd : ALLO SP NUMBER SP R . SP NUMBER CRLF  (12)
  2625. X
  2626. X    SP  shift 181
  2627. X    .  error
  2628. X
  2629. X
  2630. Xstate 164
  2631. X    rcmd : RNFR check_login SP pathname CRLF .  (47)
  2632. X
  2633. X    .  reduce 47
  2634. X
  2635. X
  2636. Xstate 165
  2637. X    cmd : DELE check_login SP pathname CRLF .  (22)
  2638. X
  2639. X    .  reduce 22
  2640. X
  2641. X
  2642. Xstate 166
  2643. X    cmd : CWD check_login SP pathname CRLF .  (26)
  2644. X
  2645. X    .  reduce 26
  2646. X
  2647. X
  2648. Xstate 167
  2649. X    cmd : LIST check_login SP pathname CRLF .  (19)
  2650. X
  2651. X    .  reduce 19
  2652. X
  2653. X
  2654. Xstate 168
  2655. X    cmd : NLST check_login SP STRING CRLF .  (17)
  2656. X
  2657. X    .  reduce 17
  2658. X
  2659. X
  2660. Xstate 169
  2661. X    cmd : SITE SP HELP SP STRING . CRLF  (35)
  2662. X
  2663. X    CRLF  shift 182
  2664. X    .  error
  2665. X
  2666. X
  2667. Xstate 170
  2668. X    cmd : SITE SP UMASK check_login SP . octal_number CRLF  (37)
  2669. X
  2670. X    NUMBER  shift 183
  2671. X    .  error
  2672. X
  2673. X    octal_number  goto 184
  2674. X
  2675. X
  2676. Xstate 171
  2677. X    cmd : SITE SP UMASK check_login CRLF .  (36)
  2678. X
  2679. X    .  reduce 36
  2680. X
  2681. X
  2682. Xstate 172
  2683. X    cmd : SITE SP IDLE SP NUMBER . CRLF  (40)
  2684. X
  2685. X    CRLF  shift 185
  2686. X    .  error
  2687. X
  2688. X
  2689. Xstate 173
  2690. X    cmd : SITE SP CHMOD check_login SP . octal_number SP pathname CRLF  (38)
  2691. X
  2692. X    NUMBER  shift 183
  2693. X    .  error
  2694. X
  2695. X    octal_number  goto 186
  2696. X
  2697. X
  2698. Xstate 174
  2699. X    cmd : STAT check_login SP pathname CRLF .  (20)
  2700. X
  2701. X    .  reduce 20
  2702. X
  2703. X
  2704. Xstate 175
  2705. X    cmd : MKD check_login SP pathname CRLF .  (30)
  2706. X
  2707. X    .  reduce 30
  2708. X
  2709. X
  2710. Xstate 176
  2711. X    cmd : RMD check_login SP pathname CRLF .  (31)
  2712. X
  2713. X    .  reduce 31
  2714. X
  2715. X
  2716. Xstate 177
  2717. X    cmd : STOU check_login SP pathname CRLF .  (41)
  2718. X
  2719. X    .  reduce 41
  2720. X
  2721. X
  2722. Xstate 178
  2723. X    cmd : SIZE check_login SP pathname CRLF .  (43)
  2724. X
  2725. X    .  reduce 43
  2726. X
  2727. X
  2728. Xstate 179
  2729. X    cmd : MDTM check_login SP pathname CRLF .  (44)
  2730. X
  2731. X    .  reduce 44
  2732. X
  2733. X
  2734. Xstate 180
  2735. X    host_port : NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER  (52)
  2736. X
  2737. X    NUMBER  shift 187
  2738. X    .  error
  2739. X
  2740. X
  2741. Xstate 181
  2742. X    cmd : ALLO SP NUMBER SP R SP . NUMBER CRLF  (12)
  2743. X
  2744. X    NUMBER  shift 188
  2745. X    .  error
  2746. X
  2747. X
  2748. Xstate 182
  2749. X    cmd : SITE SP HELP SP STRING CRLF .  (35)
  2750. X
  2751. X    .  reduce 35
  2752. X
  2753. X
  2754. Xstate 183
  2755. X    octal_number : NUMBER .  (72)
  2756. X
  2757. X    .  reduce 72
  2758. X
  2759. X
  2760. Xstate 184
  2761. X    cmd : SITE SP UMASK check_login SP octal_number . CRLF  (37)
  2762. X
  2763. X    CRLF  shift 189
  2764. X    .  error
  2765. X
  2766. X
  2767. Xstate 185
  2768. X    cmd : SITE SP IDLE SP NUMBER CRLF .  (40)
  2769. X
  2770. X    .  reduce 40
  2771. X
  2772. X
  2773. Xstate 186
  2774. X    cmd : SITE SP CHMOD check_login SP octal_number . SP pathname CRLF  (38)
  2775. X
  2776. X    SP  shift 190
  2777. X    .  error
  2778. X
  2779. X
  2780. Xstate 187
  2781. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER COMMA NUMBER  (52)
  2782. X
  2783. X    COMMA  shift 191
  2784. X    .  error
  2785. X
  2786. X
  2787. Xstate 188
  2788. X    cmd : ALLO SP NUMBER SP R SP NUMBER . CRLF  (12)
  2789. X
  2790. X    CRLF  shift 192
  2791. X    .  error
  2792. X
  2793. X
  2794. Xstate 189
  2795. X    cmd : SITE SP UMASK check_login SP octal_number CRLF .  (37)
  2796. X
  2797. X    .  reduce 37
  2798. X
  2799. X
  2800. Xstate 190
  2801. X    cmd : SITE SP CHMOD check_login SP octal_number SP . pathname CRLF  (38)
  2802. X
  2803. X    STRING  shift 94
  2804. X    .  error
  2805. X
  2806. X    pathname  goto 193
  2807. X    pathstring  goto 96
  2808. X
  2809. X
  2810. Xstate 191
  2811. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER COMMA NUMBER  (52)
  2812. X
  2813. X    NUMBER  shift 194
  2814. X    .  error
  2815. X
  2816. X
  2817. Xstate 192
  2818. X    cmd : ALLO SP NUMBER SP R SP NUMBER CRLF .  (12)
  2819. X
  2820. X    .  reduce 12
  2821. X
  2822. X
  2823. Xstate 193
  2824. X    cmd : SITE SP CHMOD check_login SP octal_number SP pathname . CRLF  (38)
  2825. X
  2826. X    CRLF  shift 195
  2827. X    .  error
  2828. X
  2829. X
  2830. Xstate 194
  2831. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER COMMA NUMBER  (52)
  2832. X
  2833. X    COMMA  shift 196
  2834. X    .  error
  2835. X
  2836. X
  2837. Xstate 195
  2838. X    cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF .  (38)
  2839. X
  2840. X    .  reduce 38
  2841. X
  2842. X
  2843. Xstate 196
  2844. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER COMMA NUMBER  (52)
  2845. X
  2846. X    NUMBER  shift 197
  2847. X    .  error
  2848. X
  2849. X
  2850. Xstate 197
  2851. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER . COMMA NUMBER  (52)
  2852. X
  2853. X    COMMA  shift 198
  2854. X    .  error
  2855. X
  2856. X
  2857. Xstate 198
  2858. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA . NUMBER  (52)
  2859. X
  2860. X    NUMBER  shift 199
  2861. X    .  error
  2862. X
  2863. X
  2864. Xstate 199
  2865. X    host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER .  (52)
  2866. X
  2867. X    .  reduce 52
  2868. X
  2869. X
  2870. X65 terminals, 16 nonterminals
  2871. X74 grammar rules, 200 states
  2872. END_OF_FILE
  2873. if test 22197 -ne `wc -c <'test/ftp.output'`; then
  2874.     echo shar: \"'test/ftp.output'\" unpacked with wrong size!
  2875. fi
  2876. # end of 'test/ftp.output'
  2877. fi
  2878. if test -f 'test/ftp.y' -a "${1}" != "-c" ; then 
  2879.   echo shar: Will not clobber existing file \"'test/ftp.y'\"
  2880. else
  2881. echo shar: Extracting \"'test/ftp.y'\" \(22998 characters\)
  2882. sed "s/^X//" >'test/ftp.y' <<'END_OF_FILE'
  2883. X/*
  2884. X * Copyright (c) 1985, 1988 Regents of the University of California.
  2885. X * All rights reserved.
  2886. X *
  2887. X * Redistribution and use in source and binary forms are permitted
  2888. X * provided that the above copyright notice and this paragraph are
  2889. X * duplicated in all such forms and that any documentation,
  2890. X * advertising materials, and other materials related to such
  2891. X * distribution and use acknowledge that the software was developed
  2892. X * by the University of California, Berkeley.  The name of the
  2893. X * University may not be used to endorse or promote products derived
  2894. X * from this software without specific prior written permission.
  2895. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  2896. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  2897. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  2898. X *
  2899. X *    @(#)ftpcmd.y    5.20.1.1 (Berkeley) 3/2/89
  2900. X */
  2901. X
  2902. X/*
  2903. X * Grammar for FTP commands.
  2904. X * See RFC 959.
  2905. X */
  2906. X
  2907. X%{
  2908. X
  2909. X#ifndef lint
  2910. Xstatic char sccsid[] = "@(#)ftpcmd.y    5.20.1.1 (Berkeley) 3/2/89";
  2911. X#endif /* not lint */
  2912. X
  2913. X#include <sys/param.h>
  2914. X#include <sys/socket.h>
  2915. X
  2916. X#include <netinet/in.h>
  2917. X
  2918. X#include <arpa/ftp.h>
  2919. X
  2920. X#include <stdio.h>
  2921. X#include <signal.h>
  2922. X#include <ctype.h>
  2923. X#include <pwd.h>
  2924. X#include <setjmp.h>
  2925. X#include <syslog.h>
  2926. X#include <sys/stat.h>
  2927. X#include <time.h>
  2928. X
  2929. Xextern    struct sockaddr_in data_dest;
  2930. Xextern    int logged_in;
  2931. Xextern    struct passwd *pw;
  2932. Xextern    int guest;
  2933. Xextern    int logging;
  2934. Xextern    int type;
  2935. Xextern    int form;
  2936. Xextern    int debug;
  2937. Xextern    int timeout;
  2938. Xextern    int maxtimeout;
  2939. Xextern  int pdata;
  2940. Xextern    char hostname[], remotehost[];
  2941. Xextern    char proctitle[];
  2942. Xextern    char *globerr;
  2943. Xextern    int usedefault;
  2944. Xextern  int transflag;
  2945. Xextern  char tmpline[];
  2946. Xchar    **glob();
  2947. X
  2948. Xstatic    int cmd_type;
  2949. Xstatic    int cmd_form;
  2950. Xstatic    int cmd_bytesz;
  2951. Xchar    cbuf[512];
  2952. Xchar    *fromname;
  2953. X
  2954. Xchar    *index();
  2955. X%}
  2956. X
  2957. X%token
  2958. X    A    B    C    E    F    I
  2959. X    L    N    P    R    S    T
  2960. X
  2961. X    SP    CRLF    COMMA    STRING    NUMBER
  2962. X
  2963. X    USER    PASS    ACCT    REIN    QUIT    PORT
  2964. X    PASV    TYPE    STRU    MODE    RETR    STOR
  2965. X    APPE    MLFL    MAIL    MSND    MSOM    MSAM
  2966. X    MRSQ    MRCP    ALLO    REST    RNFR    RNTO
  2967. X    ABOR    DELE    CWD    LIST    NLST    SITE
  2968. X    STAT    HELP    NOOP    MKD    RMD    PWD
  2969. X    CDUP    STOU    SMNT    SYST    SIZE    MDTM
  2970. X
  2971. X    UMASK    IDLE    CHMOD
  2972. X
  2973. X    LEXERR
  2974. X
  2975. X%start    cmd_list
  2976. X
  2977. X%%
  2978. X
  2979. Xcmd_list:    /* empty */
  2980. X    |    cmd_list cmd
  2981. X        = {
  2982. X            fromname = (char *) 0;
  2983. X        }
  2984. X    |    cmd_list rcmd
  2985. X    ;
  2986. X
  2987. Xcmd:        USER SP username CRLF
  2988. X        = {
  2989. X            user((char *) $3);
  2990. X            free((char *) $3);
  2991. X        }
  2992. X    |    PASS SP password CRLF
  2993. X        = {
  2994. X            pass((char *) $3);
  2995. X            free((char *) $3);
  2996. X        }
  2997. X    |    PORT SP host_port CRLF
  2998. X        = {
  2999. X            usedefault = 0;
  3000. X            if (pdata >= 0) {
  3001. X                (void) close(pdata);
  3002. X                pdata = -1;
  3003. X            }
  3004. X            reply(200, "PORT command successful.");
  3005. X        }
  3006. X    |    PASV CRLF
  3007. X        = {
  3008. X            passive();
  3009. X        }
  3010. X    |    TYPE SP type_code CRLF
  3011. X        = {
  3012. X            switch (cmd_type) {
  3013. X
  3014. X            case TYPE_A:
  3015. X                if (cmd_form == FORM_N) {
  3016. X                    reply(200, "Type set to A.");
  3017. X                    type = cmd_type;
  3018. X                    form = cmd_form;
  3019. X                } else
  3020. X                    reply(504, "Form must be N.");
  3021. X                break;
  3022. X
  3023. X            case TYPE_E:
  3024. X                reply(504, "Type E not implemented.");
  3025. X                break;
  3026. X
  3027. X            case TYPE_I:
  3028. X                reply(200, "Type set to I.");
  3029. X                type = cmd_type;
  3030. X                break;
  3031. X
  3032. X            case TYPE_L:
  3033. X#if NBBY == 8
  3034. X                if (cmd_bytesz == 8) {
  3035. X                    reply(200,
  3036. X                        "Type set to L (byte size 8).");
  3037. X                    type = cmd_type;
  3038. X                } else
  3039. X                    reply(504, "Byte size must be 8.");
  3040. X#else /* NBBY == 8 */
  3041. X                UNIMPLEMENTED for NBBY != 8
  3042. X#endif /* NBBY == 8 */
  3043. X            }
  3044. X        }
  3045. X    |    STRU SP struct_code CRLF
  3046. X        = {
  3047. X            switch ($3) {
  3048. X
  3049. X            case STRU_F:
  3050. X                reply(200, "STRU F ok.");
  3051. X                break;
  3052. X
  3053. X            default:
  3054. X                reply(504, "Unimplemented STRU type.");
  3055. X            }
  3056. X        }
  3057. X    |    MODE SP mode_code CRLF
  3058. X        = {
  3059. X            switch ($3) {
  3060. X
  3061. X            case MODE_S:
  3062. X                reply(200, "MODE S ok.");
  3063. X                break;
  3064. X
  3065. X            default:
  3066. X                reply(502, "Unimplemented MODE type.");
  3067. X            }
  3068. X        }
  3069. X    |    ALLO SP NUMBER CRLF
  3070. X        = {
  3071. X            reply(202, "ALLO command ignored.");
  3072. X        }
  3073. X    |    ALLO SP NUMBER SP R SP NUMBER CRLF
  3074. X        = {
  3075. X            reply(202, "ALLO command ignored.");
  3076. X        }
  3077. X    |    RETR check_login SP pathname CRLF
  3078. X        = {
  3079. X            if ($2 && $4 != NULL)
  3080. X                retrieve((char *) 0, (char *) $4);
  3081. X            if ($4 != NULL)
  3082. X                free((char *) $4);
  3083. X        }
  3084. X    |    STOR check_login SP pathname CRLF
  3085. X        = {
  3086. X            if ($2 && $4 != NULL)
  3087. X                store((char *) $4, "w", 0);
  3088. X            if ($4 != NULL)
  3089. X                free((char *) $4);
  3090. X        }
  3091. X    |    APPE check_login SP pathname CRLF
  3092. X        = {
  3093. X            if ($2 && $4 != NULL)
  3094. X                store((char *) $4, "a", 0);
  3095. X            if ($4 != NULL)
  3096. X                free((char *) $4);
  3097. X        }
  3098. X    |    NLST check_login CRLF
  3099. X        = {
  3100. X            if ($2)
  3101. X                send_file_list(".");
  3102. X        }
  3103. X    |    NLST check_login SP STRING CRLF
  3104. X        = {
  3105. X            if ($2 && $4 != NULL) 
  3106. X                send_file_list((char *) $4);
  3107. X            if ($4 != NULL)
  3108. X                free((char *) $4);
  3109. X        }
  3110. X    |    LIST check_login CRLF
  3111. X        = {
  3112. X            if ($2)
  3113. X                retrieve("/bin/ls -lgA", "");
  3114. X        }
  3115. X    |    LIST check_login SP pathname CRLF
  3116. X        = {
  3117. X            if ($2 && $4 != NULL)
  3118. X                retrieve("/bin/ls -lgA %s", (char *) $4);
  3119. X            if ($4 != NULL)
  3120. X                free((char *) $4);
  3121. X        }
  3122. X    |    STAT check_login SP pathname CRLF
  3123. X        = {
  3124. X            if ($2 && $4 != NULL)
  3125. X                statfilecmd((char *) $4);
  3126. X            if ($4 != NULL)
  3127. X                free((char *) $4);
  3128. X        }
  3129. X    |    STAT CRLF
  3130. X        = {
  3131. X            statcmd();
  3132. X        }
  3133. X    |    DELE check_login SP pathname CRLF
  3134. X        = {
  3135. X            if ($2 && $4 != NULL)
  3136. X                delete((char *) $4);
  3137. X            if ($4 != NULL)
  3138. X                free((char *) $4);
  3139. X        }
  3140. X    |    RNTO SP pathname CRLF
  3141. X        = {
  3142. X            if (fromname) {
  3143. X                renamecmd(fromname, (char *) $3);
  3144. X                free(fromname);
  3145. X                fromname = (char *) 0;
  3146. X            } else {
  3147. X                reply(503, "Bad sequence of commands.");
  3148. X            }
  3149. X            free((char *) $3);
  3150. X        }
  3151. X    |    ABOR CRLF
  3152. X        = {
  3153. X            reply(225, "ABOR command successful.");
  3154. X        }
  3155. X    |    CWD check_login CRLF
  3156. X        = {
  3157. X            if ($2)
  3158. X                cwd(pw->pw_dir);
  3159. X        }
  3160. X    |    CWD check_login SP pathname CRLF
  3161. X        = {
  3162. X            if ($2 && $4 != NULL)
  3163. X                cwd((char *) $4);
  3164. X            if ($4 != NULL)
  3165. X                free((char *) $4);
  3166. X        }
  3167. X    |    HELP CRLF
  3168. X        = {
  3169. X            help(cmdtab, (char *) 0);
  3170. X        }
  3171. X    |    HELP SP STRING CRLF
  3172. X        = {
  3173. X            register char *cp = (char *)$3;
  3174. X
  3175. X            if (strncasecmp(cp, "SITE", 4) == 0) {
  3176. X                cp = (char *)$3 + 4;
  3177. X                if (*cp == ' ')
  3178. X                    cp++;
  3179. X                if (*cp)
  3180. X                    help(sitetab, cp);
  3181. X                else
  3182. X                    help(sitetab, (char *) 0);
  3183. X            } else
  3184. X                help(cmdtab, (char *) $3);
  3185. X        }
  3186. X    |    NOOP CRLF
  3187. X        = {
  3188. X            reply(200, "NOOP command successful.");
  3189. X        }
  3190. X    |    MKD check_login SP pathname CRLF
  3191. X        = {
  3192. X            if ($2 && $4 != NULL)
  3193. X                makedir((char *) $4);
  3194. X            if ($4 != NULL)
  3195. X                free((char *) $4);
  3196. X        }
  3197. X    |    RMD check_login SP pathname CRLF
  3198. X        = {
  3199. X            if ($2 && $4 != NULL)
  3200. X                removedir((char *) $4);
  3201. X            if ($4 != NULL)
  3202. X                free((char *) $4);
  3203. X        }
  3204. X    |    PWD check_login CRLF
  3205. X        = {
  3206. X            if ($2)
  3207. X                pwd();
  3208. X        }
  3209. X    |    CDUP check_login CRLF
  3210. X        = {
  3211. X            if ($2)
  3212. X                cwd("..");
  3213. X        }
  3214. X    |    SITE SP HELP CRLF
  3215. X        = {
  3216. X            help(sitetab, (char *) 0);
  3217. X        }
  3218. X    |    SITE SP HELP SP STRING CRLF
  3219. X        = {
  3220. X            help(sitetab, (char *) $5);
  3221. X        }
  3222. X    |    SITE SP UMASK check_login CRLF
  3223. X        = {
  3224. X            int oldmask;
  3225. X
  3226. X            if ($4) {
  3227. X                oldmask = umask(0);
  3228. X                (void) umask(oldmask);
  3229. X                reply(200, "Current UMASK is %03o", oldmask);
  3230. X            }
  3231. X        }
  3232. X    |    SITE SP UMASK check_login SP octal_number CRLF
  3233. X        = {
  3234. X            int oldmask;
  3235. X
  3236. X            if ($4) {
  3237. X                if (($6 == -1) || ($6 > 0777)) {
  3238. X                    reply(501, "Bad UMASK value");
  3239. X                } else {
  3240. X                    oldmask = umask($6);
  3241. X                    reply(200,
  3242. X                        "UMASK set to %03o (was %03o)",
  3243. X                        $6, oldmask);
  3244. X                }
  3245. X            }
  3246. X        }
  3247. X    |    SITE SP CHMOD check_login SP octal_number SP pathname CRLF
  3248. X        = {
  3249. X            if ($4 && ($8 != NULL)) {
  3250. X                if ($6 > 0777)
  3251. X                    reply(501,
  3252. X                "CHMOD: Mode value must be between 0 and 0777");
  3253. X                else if (chmod((char *) $8, $6) < 0)
  3254. X                    perror_reply(550, (char *) $8);
  3255. X                else
  3256. X                    reply(200, "CHMOD command successful.");
  3257. X            }
  3258. X            if ($8 != NULL)
  3259. X                free((char *) $8);
  3260. X        }
  3261. X    |    SITE SP IDLE CRLF
  3262. X        = {
  3263. X            reply(200,
  3264. X                "Current IDLE time limit is %d seconds; max %d",
  3265. X                timeout, maxtimeout);
  3266. X        }
  3267. X    |    SITE SP IDLE SP NUMBER CRLF
  3268. X        = {
  3269. X            if ($5 < 30 || $5 > maxtimeout) {
  3270. X                reply(501,
  3271. X            "Maximum IDLE time must be between 30 and %d seconds",
  3272. X                    maxtimeout);
  3273. X            } else {
  3274. X                timeout = $5;
  3275. X                (void) alarm((unsigned) timeout);
  3276. X                reply(200,
  3277. X                    "Maximum IDLE time set to %d seconds",
  3278. X                    timeout);
  3279. X            }
  3280. X        }
  3281. X    |    STOU check_login SP pathname CRLF
  3282. X        = {
  3283. X            if ($2 && $4 != NULL)
  3284. X                store((char *) $4, "w", 1);
  3285. X            if ($4 != NULL)
  3286. X                free((char *) $4);
  3287. X        }
  3288. X    |    SYST CRLF
  3289. X        = {
  3290. X#ifdef unix
  3291. X#ifdef BSD
  3292. X            reply(215, "UNIX Type: L%d Version: BSD-%d",
  3293. X                NBBY, BSD);
  3294. X#else /* BSD */
  3295. X            reply(215, "UNIX Type: L%d", NBBY);
  3296. X#endif /* BSD */
  3297. X#else /* unix */
  3298. X            reply(215, "UNKNOWN Type: L%d", NBBY);
  3299. X#endif /* unix */
  3300. X        }
  3301. X
  3302. X        /*
  3303. X         * SIZE is not in RFC959, but Postel has blessed it and
  3304. X         * it will be in the updated RFC.
  3305. X         *
  3306. X         * Return size of file in a format suitable for
  3307. X         * using with RESTART (we just count bytes).
  3308. X         */
  3309. X    |    SIZE check_login SP pathname CRLF
  3310. X        = {
  3311. X            if ($2 && $4 != NULL)
  3312. X                sizecmd((char *) $4);
  3313. X            if ($4 != NULL)
  3314. X                free((char *) $4);
  3315. X        }
  3316. X
  3317. X        /*
  3318. X         * MDTM is not in RFC959, but Postel has blessed it and
  3319. X         * it will be in the updated RFC.
  3320. X         *
  3321. X         * Return modification time of file as an ISO 3307
  3322. X         * style time. E.g. YYYYMMDDHHMMSS or YYYYMMDDHHMMSS.xxx
  3323. X         * where xxx is the fractional second (of any precision,
  3324. X         * not necessarily 3 digits)
  3325. X         */
  3326. X    |    MDTM check_login SP pathname CRLF
  3327. X        = {
  3328. X            if ($2 && $4 != NULL) {
  3329. X                struct stat stbuf;
  3330. X                if (stat((char *) $4, &stbuf) < 0)
  3331. X                    perror_reply(550, "%s", (char *) $4);
  3332. X                else if ((stbuf.st_mode&S_IFMT) != S_IFREG) {
  3333. X                    reply(550, "%s: not a plain file.",
  3334. X                        (char *) $4);
  3335. X                } else {
  3336. X                    register struct tm *t;
  3337. X                    struct tm *gmtime();
  3338. X                    t = gmtime(&stbuf.st_mtime);
  3339. X                    reply(213,
  3340. X                        "19%02d%02d%02d%02d%02d%02d",
  3341. X                        t->tm_year, t->tm_mon+1, t->tm_mday,
  3342. X                        t->tm_hour, t->tm_min, t->tm_sec);
  3343. X                }
  3344. X            }
  3345. X            if ($4 != NULL)
  3346. X                free((char *) $4);
  3347. X        }
  3348. X    |    QUIT CRLF
  3349. X        = {
  3350. X            reply(221, "Goodbye.");
  3351. X            dologout(0);
  3352. X        }
  3353. X    |    error CRLF
  3354. X        = {
  3355. X            yyerrok;
  3356. X        }
  3357. X    ;
  3358. Xrcmd:        RNFR check_login SP pathname CRLF
  3359. X        = {
  3360. X            char *renamefrom();
  3361. X
  3362. X            if ($2 && $4) {
  3363. X                fromname = renamefrom((char *) $4);
  3364. X                if (fromname == (char *) 0 && $4) {
  3365. X                    free((char *) $4);
  3366. X                }
  3367. X            }
  3368. X        }
  3369. X    ;
  3370. X        
  3371. Xusername:    STRING
  3372. X    ;
  3373. X
  3374. Xpassword:    /* empty */
  3375. X        = {
  3376. X            *(char **)&($$) = "";
  3377. X        }
  3378. X    |    STRING
  3379. X    ;
  3380. X
  3381. Xbyte_size:    NUMBER
  3382. X    ;
  3383. X
  3384. Xhost_port:    NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA 
  3385. X        NUMBER COMMA NUMBER
  3386. X        = {
  3387. X            register char *a, *p;
  3388. X
  3389. X            a = (char *)&data_dest.sin_addr;
  3390. X            a[0] = $1; a[1] = $3; a[2] = $5; a[3] = $7;
  3391. X            p = (char *)&data_dest.sin_port;
  3392. X            p[0] = $9; p[1] = $11;
  3393. X            data_dest.sin_family = AF_INET;
  3394. X        }
  3395. X    ;
  3396. X
  3397. Xform_code:    N
  3398. X    = {
  3399. X        $$ = FORM_N;
  3400. X    }
  3401. X    |    T
  3402. X    = {
  3403. X        $$ = FORM_T;
  3404. X    }
  3405. X    |    C
  3406. X    = {
  3407. X        $$ = FORM_C;
  3408. X    }
  3409. X    ;
  3410. X
  3411. Xtype_code:    A
  3412. X    = {
  3413. X        cmd_type = TYPE_A;
  3414. X        cmd_form = FORM_N;
  3415. X    }
  3416. X    |    A SP form_code
  3417. X    = {
  3418. X        cmd_type = TYPE_A;
  3419. X        cmd_form = $3;
  3420. X    }
  3421. X    |    E
  3422. X    = {
  3423. X        cmd_type = TYPE_E;
  3424. X        cmd_form = FORM_N;
  3425. X    }
  3426. X    |    E SP form_code
  3427. X    = {
  3428. X        cmd_type = TYPE_E;
  3429. X        cmd_form = $3;
  3430. X    }
  3431. X    |    I
  3432. X    = {
  3433. X        cmd_type = TYPE_I;
  3434. X    }
  3435. X    |    L
  3436. X    = {
  3437. X        cmd_type = TYPE_L;
  3438. X        cmd_bytesz = NBBY;
  3439. X    }
  3440. X    |    L SP byte_size
  3441. X    = {
  3442. X        cmd_type = TYPE_L;
  3443. X        cmd_bytesz = $3;
  3444. X    }
  3445. X    /* this is for a bug in the BBN ftp */
  3446. X    |    L byte_size
  3447. X    = {
  3448. X        cmd_type = TYPE_L;
  3449. X        cmd_bytesz = $2;
  3450. X    }
  3451. X    ;
  3452. X
  3453. Xstruct_code:    F
  3454. X    = {
  3455. X        $$ = STRU_F;
  3456. X    }
  3457. X    |    R
  3458. X    = {
  3459. X        $$ = STRU_R;
  3460. X    }
  3461. X    |    P
  3462. X    = {
  3463. X        $$ = STRU_P;
  3464. X    }
  3465. X    ;
  3466. X
  3467. Xmode_code:    S
  3468. X    = {
  3469. X        $$ = MODE_S;
  3470. X    }
  3471. X    |    B
  3472. X    = {
  3473. X        $$ = MODE_B;
  3474. X    }
  3475. X    |    C
  3476. X    = {
  3477. X        $$ = MODE_C;
  3478. X    }
  3479. X    ;
  3480. X
  3481. Xpathname:    pathstring
  3482. X    = {
  3483. X        /*
  3484. X         * Problem: this production is used for all pathname
  3485. X         * processing, but only gives a 550 error reply.
  3486. X         * This is a valid reply in some cases but not in others.
  3487. X         */
  3488. X        if (logged_in && $1 && strncmp((char *) $1, "~", 1) == 0) {
  3489. X            *(char **)&($$) = *glob((char *) $1);
  3490. X            if (globerr != NULL) {
  3491. X                reply(550, globerr);
  3492. X                $$ = NULL;
  3493. X            }
  3494. X            free((char *) $1);
  3495. X        } else
  3496. X            $$ = $1;
  3497. X    }
  3498. X    ;
  3499. X
  3500. Xpathstring:    STRING
  3501. X    ;
  3502. X
  3503. Xoctal_number:    NUMBER
  3504. X    = {
  3505. X        register int ret, dec, multby, digit;
  3506. X
  3507. X        /*
  3508. X         * Convert a number that was read as decimal number
  3509. X         * to what it would be if it had been read as octal.
  3510. X         */
  3511. X        dec = $1;
  3512. X        multby = 1;
  3513. X        ret = 0;
  3514. X        while (dec) {
  3515. X            digit = dec%10;
  3516. X            if (digit > 7) {
  3517. X                ret = -1;
  3518. X                break;
  3519. X            }
  3520. X            ret += digit * multby;
  3521. X            multby *= 8;
  3522. X            dec /= 10;
  3523. X        }
  3524. X        $$ = ret;
  3525. X    }
  3526. X    ;
  3527. X
  3528. Xcheck_login:    /* empty */
  3529. X    = {
  3530. X        if (logged_in)
  3531. X            $$ = 1;
  3532. X        else {
  3533. X            reply(530, "Please login with USER and PASS.");
  3534. X            $$ = 0;
  3535. X        }
  3536. X    }
  3537. X    ;
  3538. X
  3539. X%%
  3540. X
  3541. Xextern jmp_buf errcatch;
  3542. X
  3543. X#define    CMD    0    /* beginning of command */
  3544. X#define    ARGS    1    /* expect miscellaneous arguments */
  3545. X#define    STR1    2    /* expect SP followed by STRING */
  3546. X#define    STR2    3    /* expect STRING */
  3547. X#define    OSTR    4    /* optional SP then STRING */
  3548. X#define    ZSTR1    5    /* SP then optional STRING */
  3549. X#define    ZSTR2    6    /* optional STRING after SP */
  3550. X#define    SITECMD    7    /* SITE command */
  3551. X#define    NSTR    8    /* Number followed by a string */
  3552. X
  3553. Xstruct tab {
  3554. X    char    *name;
  3555. X    short    token;
  3556. X    short    state;
  3557. X    short    implemented;    /* 1 if command is implemented */
  3558. X    char    *help;
  3559. X};
  3560. X
  3561. Xstruct tab cmdtab[] = {        /* In order defined in RFC 765 */
  3562. X    { "USER", USER, STR1, 1,    "<sp> username" },
  3563. X    { "PASS", PASS, ZSTR1, 1,    "<sp> password" },
  3564. X    { "ACCT", ACCT, STR1, 0,    "(specify account)" },
  3565. X    { "SMNT", SMNT, ARGS, 0,    "(structure mount)" },
  3566. X    { "REIN", REIN, ARGS, 0,    "(reinitialize server state)" },
  3567. X    { "QUIT", QUIT, ARGS, 1,    "(terminate service)", },
  3568. X    { "PORT", PORT, ARGS, 1,    "<sp> b0, b1, b2, b3, b4" },
  3569. X    { "PASV", PASV, ARGS, 1,    "(set server in passive mode)" },
  3570. X    { "TYPE", TYPE, ARGS, 1,    "<sp> [ A | E | I | L ]" },
  3571. X    { "STRU", STRU, ARGS, 1,    "(specify file structure)" },
  3572. X    { "MODE", MODE, ARGS, 1,    "(specify transfer mode)" },
  3573. X    { "RETR", RETR, STR1, 1,    "<sp> file-name" },
  3574. X    { "STOR", STOR, STR1, 1,    "<sp> file-name" },
  3575. X    { "APPE", APPE, STR1, 1,    "<sp> file-name" },
  3576. X    { "MLFL", MLFL, OSTR, 0,    "(mail file)" },
  3577. X    { "MAIL", MAIL, OSTR, 0,    "(mail to user)" },
  3578. X    { "MSND", MSND, OSTR, 0,    "(mail send to terminal)" },
  3579. X    { "MSOM", MSOM, OSTR, 0,    "(mail send to terminal or mailbox)" },
  3580. X    { "MSAM", MSAM, OSTR, 0,    "(mail send to terminal and mailbox)" },
  3581. X    { "MRSQ", MRSQ, OSTR, 0,    "(mail recipient scheme question)" },
  3582. X    { "MRCP", MRCP, STR1, 0,    "(mail recipient)" },
  3583. X    { "ALLO", ALLO, ARGS, 1,    "allocate storage (vacuously)" },
  3584. X    { "REST", REST, ARGS, 0,    "(restart command)" },
  3585. X    { "RNFR", RNFR, STR1, 1,    "<sp> file-name" },
  3586. X    { "RNTO", RNTO, STR1, 1,    "<sp> file-name" },
  3587. X    { "ABOR", ABOR, ARGS, 1,    "(abort operation)" },
  3588. X    { "DELE", DELE, STR1, 1,    "<sp> file-name" },
  3589. X    { "CWD",  CWD,  OSTR, 1,    "[ <sp> directory-name ]" },
  3590. X    { "XCWD", CWD,    OSTR, 1,    "[ <sp> directory-name ]" },
  3591. X    { "LIST", LIST, OSTR, 1,    "[ <sp> path-name ]" },
  3592. X    { "NLST", NLST, OSTR, 1,    "[ <sp> path-name ]" },
  3593. X    { "SITE", SITE, SITECMD, 1,    "site-cmd [ <sp> arguments ]" },
  3594. X    { "SYST", SYST, ARGS, 1,    "(get type of operating system)" },
  3595. X    { "STAT", STAT, OSTR, 1,    "[ <sp> path-name ]" },
  3596. X    { "HELP", HELP, OSTR, 1,    "[ <sp> <string> ]" },
  3597. X    { "NOOP", NOOP, ARGS, 1,    "" },
  3598. X    { "MKD",  MKD,  STR1, 1,    "<sp> path-name" },
  3599. X    { "XMKD", MKD,  STR1, 1,    "<sp> path-name" },
  3600. X    { "RMD",  RMD,  STR1, 1,    "<sp> path-name" },
  3601. X    { "XRMD", RMD,  STR1, 1,    "<sp> path-name" },
  3602. X    { "PWD",  PWD,  ARGS, 1,    "(return current directory)" },
  3603. X    { "XPWD", PWD,  ARGS, 1,    "(return current directory)" },
  3604. X    { "CDUP", CDUP, ARGS, 1,    "(change to parent directory)" },
  3605. X    { "XCUP", CDUP, ARGS, 1,    "(change to parent directory)" },
  3606. X    { "STOU", STOU, STR1, 1,    "<sp> file-name" },
  3607. X    { "SIZE", SIZE, OSTR, 1,    "<sp> path-name" },
  3608. X    { "MDTM", MDTM, OSTR, 1,    "<sp> path-name" },
  3609. X    { NULL,   0,    0,    0,    0 }
  3610. X};
  3611. X
  3612. Xstruct tab sitetab[] = {
  3613. X    { "UMASK", UMASK, ARGS, 1,    "[ <sp> umask ]" },
  3614. X    { "IDLE", IDLE, ARGS, 1,    "[ <sp> maximum-idle-time ]" },
  3615. X    { "CHMOD", CHMOD, NSTR, 1,    "<sp> mode <sp> file-name" },
  3616. X    { "HELP", HELP, OSTR, 1,    "[ <sp> <string> ]" },
  3617. X    { NULL,   0,    0,    0,    0 }
  3618. X};
  3619. X
  3620. Xstruct tab *
  3621. Xlookup(p, cmd)
  3622. X    register struct tab *p;
  3623. X    char *cmd;
  3624. X{
  3625. X
  3626. X    for (; p->name != NULL; p++)
  3627. X        if (strcmp(cmd, p->name) == 0)
  3628. X            return (p);
  3629. X    return (0);
  3630. X}
  3631. X
  3632. X#include <arpa/telnet.h>
  3633. X
  3634. X/*
  3635. X * getline - a hacked up version of fgets to ignore TELNET escape codes.
  3636. X */
  3637. Xchar *
  3638. Xgetline(s, n, iop)
  3639. X    char *s;
  3640. X    register FILE *iop;
  3641. X{
  3642. X    register c;
  3643. X    register char *cs;
  3644. X
  3645. X    cs = s;
  3646. X/* tmpline may contain saved command from urgent mode interruption */
  3647. X    for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
  3648. X        *cs++ = tmpline[c];
  3649. X        if (tmpline[c] == '\n') {
  3650. X            *cs++ = '\0';
  3651. X            if (debug)
  3652. X                syslog(LOG_DEBUG, "command: %s", s);
  3653. X            tmpline[0] = '\0';
  3654. X            return(s);
  3655. X        }
  3656. X        if (c == 0)
  3657. X            tmpline[0] = '\0';
  3658. X    }
  3659. X    while ((c = getc(iop)) != EOF) {
  3660. X        c &= 0377;
  3661. X        if (c == IAC) {
  3662. X            if ((c = getc(iop)) != EOF) {
  3663. X            c &= 0377;
  3664. X            switch (c) {
  3665. X            case WILL:
  3666. X            case WONT:
  3667. X                c = getc(iop);
  3668. X                printf("%c%c%c", IAC, DONT, 0377&c);
  3669. X                (void) fflush(stdout);
  3670. X                continue;
  3671. X            case DO:
  3672. X            case DONT:
  3673. X                c = getc(iop);
  3674. X                printf("%c%c%c", IAC, WONT, 0377&c);
  3675. X                (void) fflush(stdout);
  3676. X                continue;
  3677. X            case IAC:
  3678. X                break;
  3679. X            default:
  3680. X                continue;    /* ignore command */
  3681. X            }
  3682. X            }
  3683. X        }
  3684. X        *cs++ = c;
  3685. X        if (--n <= 0 || c == '\n')
  3686. X            break;
  3687. X    }
  3688. X    if (c == EOF && cs == s)
  3689. X        return (NULL);
  3690. X    *cs++ = '\0';
  3691. X    if (debug)
  3692. X        syslog(LOG_DEBUG, "command: %s", s);
  3693. X    return (s);
  3694. X}
  3695. X
  3696. Xstatic int
  3697. Xtoolong()
  3698. X{
  3699. X    time_t now;
  3700. X    extern char *ctime();
  3701. X    extern time_t time();
  3702. X
  3703. X    reply(421,
  3704. X      "Timeout (%d seconds): closing control connection.", timeout);
  3705. X    (void) time(&now);
  3706. X    if (logging) {
  3707. X        syslog(LOG_INFO,
  3708. X            "User %s timed out after %d seconds at %s",
  3709. X            (pw ? pw -> pw_name : "unknown"), timeout, ctime(&now));
  3710. X    }
  3711. X    dologout(1);
  3712. X}
  3713. X
  3714. Xyylex()
  3715. X{
  3716. X    static int cpos, state;
  3717. X    register char *cp, *cp2;
  3718. X    register struct tab *p;
  3719. X    int n;
  3720. X    char c, *strpbrk();
  3721. X    char *copy();
  3722. X
  3723. X    for (;;) {
  3724. X        switch (state) {
  3725. X
  3726. X        case CMD:
  3727. X            (void) signal(SIGALRM, toolong);
  3728. X            (void) alarm((unsigned) timeout);
  3729. X            if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
  3730. X                reply(221, "You could at least say goodbye.");
  3731. X                dologout(0);
  3732. X            }
  3733. X            (void) alarm(0);
  3734. X#ifdef SETPROCTITLE
  3735. X            if (strncasecmp(cbuf, "PASS", 4) != NULL)
  3736. X                setproctitle("%s: %s", proctitle, cbuf);
  3737. X#endif /* SETPROCTITLE */
  3738. X            if ((cp = index(cbuf, '\r'))) {
  3739. X                *cp++ = '\n';
  3740. X                *cp = '\0';
  3741. X            }
  3742. X            if ((cp = strpbrk(cbuf, " \n")))
  3743. X                cpos = cp - cbuf;
  3744. X            if (cpos == 0)
  3745. X                cpos = 4;
  3746. X            c = cbuf[cpos];
  3747. X            cbuf[cpos] = '\0';
  3748. X            upper(cbuf);
  3749. X            p = lookup(cmdtab, cbuf);
  3750. X            cbuf[cpos] = c;
  3751. X            if (p != 0) {
  3752. X                if (p->implemented == 0) {
  3753. X                    nack(p->name);
  3754. X                    longjmp(errcatch,0);
  3755. X                    /* NOTREACHED */
  3756. X                }
  3757. X                state = p->state;
  3758. X                *(char **)&yylval = p->name;
  3759. X                return (p->token);
  3760. X            }
  3761. X            break;
  3762. X
  3763. X        case SITECMD:
  3764. X            if (cbuf[cpos] == ' ') {
  3765. X                cpos++;
  3766. X                return (SP);
  3767. X            }
  3768. X            cp = &cbuf[cpos];
  3769. X            if ((cp2 = strpbrk(cp, " \n")))
  3770. X                cpos = cp2 - cbuf;
  3771. X            c = cbuf[cpos];
  3772. X            cbuf[cpos] = '\0';
  3773. X            upper(cp);
  3774. X            p = lookup(sitetab, cp);
  3775. X            cbuf[cpos] = c;
  3776. X            if (p != 0) {
  3777. X                if (p->implemented == 0) {
  3778. X                    state = CMD;
  3779. X                    nack(p->name);
  3780. X                    longjmp(errcatch,0);
  3781. X                    /* NOTREACHED */
  3782. X                }
  3783. X                state = p->state;
  3784. X                *(char **)&yylval = p->name;
  3785. X                return (p->token);
  3786. X            }
  3787. X            state = CMD;
  3788. X            break;
  3789. X
  3790. X        case OSTR:
  3791. X            if (cbuf[cpos] == '\n') {
  3792. X                state = CMD;
  3793. X                return (CRLF);
  3794. X            }
  3795. X            /* FALLTHROUGH */
  3796. X
  3797. X        case STR1:
  3798. X        case ZSTR1:
  3799. X        dostr1:
  3800. X            if (cbuf[cpos] == ' ') {
  3801. X                cpos++;
  3802. X                state = state == OSTR ? STR2 : ++state;
  3803. X                return (SP);
  3804. X            }
  3805. X            break;
  3806. X
  3807. X        case ZSTR2:
  3808. X            if (cbuf[cpos] == '\n') {
  3809. X                state = CMD;
  3810. X                return (CRLF);
  3811. X            }
  3812. X            /* FALLTHROUGH */
  3813. X
  3814. X        case STR2:
  3815. X            cp = &cbuf[cpos];
  3816. X            n = strlen(cp);
  3817. X            cpos += n - 1;
  3818. X            /*
  3819. X             * Make sure the string is nonempty and \n terminated.
  3820. X             */
  3821. X            if (n > 1 && cbuf[cpos] == '\n') {
  3822. X                cbuf[cpos] = '\0';
  3823. X                *(char **)&yylval = copy(cp);
  3824. X                cbuf[cpos] = '\n';
  3825. X                state = ARGS;
  3826. X                return (STRING);
  3827. X            }
  3828. X            break;
  3829. X
  3830. X        case NSTR:
  3831. X            if (cbuf[cpos] == ' ') {
  3832. X                cpos++;
  3833. X                return (SP);
  3834. X            }
  3835. X            if (isdigit(cbuf[cpos])) {
  3836. X                cp = &cbuf[cpos];
  3837. X                while (isdigit(cbuf[++cpos]))
  3838. X                    ;
  3839. X                c = cbuf[cpos];
  3840. X                cbuf[cpos] = '\0';
  3841. X                yylval = atoi(cp);
  3842. X                cbuf[cpos] = c;
  3843. X                state = STR1;
  3844. X                return (NUMBER);
  3845. X            }
  3846. X            state = STR1;
  3847. X            goto dostr1;
  3848. X
  3849. X        case ARGS:
  3850. X            if (isdigit(cbuf[cpos])) {
  3851. X                cp = &cbuf[cpos];
  3852. X                while (isdigit(cbuf[++cpos]))
  3853. X                    ;
  3854. X                c = cbuf[cpos];
  3855. X                cbuf[cpos] = '\0';
  3856. X                yylval = atoi(cp);
  3857. X                cbuf[cpos] = c;
  3858. X                return (NUMBER);
  3859. X            }
  3860. X            switch (cbuf[cpos++]) {
  3861. X
  3862. X            case '\n':
  3863. X                state = CMD;
  3864. X                return (CRLF);
  3865. X
  3866. X            case ' ':
  3867. X                return (SP);
  3868. X
  3869. X            case ',':
  3870. X                return (COMMA);
  3871. X
  3872. X            case 'A':
  3873. X            case 'a':
  3874. X                return (A);
  3875. X
  3876. X            case 'B':
  3877. X            case 'b':
  3878. X                return (B);
  3879. X
  3880. X            case 'C':
  3881. X            case 'c':
  3882. X                return (C);
  3883. X
  3884. X            case 'E':
  3885. X            case 'e':
  3886. X                return (E);
  3887. X
  3888. X            case 'F':
  3889. X            case 'f':
  3890. X                return (F);
  3891. X
  3892. X            case 'I':
  3893. X            case 'i':
  3894. X                return (I);
  3895. X
  3896. X            case 'L':
  3897. X            case 'l':
  3898. X                return (L);
  3899. X
  3900. X            case 'N':
  3901. X            case 'n':
  3902. X                return (N);
  3903. X
  3904. X            case 'P':
  3905. X            case 'p':
  3906. X                return (P);
  3907. X
  3908. X            case 'R':
  3909. X            case 'r':
  3910. X                return (R);
  3911. X
  3912. X            case 'S':
  3913. X            case 's':
  3914. X                return (S);
  3915. X
  3916. X            case 'T':
  3917. X            case 't':
  3918. X                return (T);
  3919. X
  3920. X            }
  3921. X            break;
  3922. X
  3923. X        default:
  3924. X            fatal("Unknown state in scanner.");
  3925. X        }
  3926. X        yyerror((char *) 0);
  3927. X        state = CMD;
  3928. X        longjmp(errcatch,0);
  3929. X    }
  3930. X}
  3931. X
  3932. Xupper(s)
  3933. X    register char *s;
  3934. X{
  3935. X    while (*s != '\0') {
  3936. X        if (islower(*s))
  3937. X            *s = toupper(*s);
  3938. X        s++;
  3939. X    }
  3940. X}
  3941. X
  3942. Xchar *
  3943. Xcopy(s)
  3944. X    char *s;
  3945. X{
  3946. X    char *p;
  3947. X    extern char *malloc(), *strcpy();
  3948. X
  3949. X    p = malloc((unsigned) strlen(s) + 1);
  3950. X    if (p == NULL)
  3951. X        fatal("Ran out of memory.");
  3952. X    (void) strcpy(p, s);
  3953. X    return (p);
  3954. X}
  3955. X
  3956. Xhelp(ctab, s)
  3957. X    struct tab *ctab;
  3958. X    char *s;
  3959. X{
  3960. X    register struct tab *c;
  3961. X    register int width, NCMDS;
  3962. X    char *type;
  3963. X
  3964. X    if (ctab == sitetab)
  3965. X        type = "SITE ";
  3966. X    else
  3967. X        type = "";
  3968. X    width = 0, NCMDS = 0;
  3969. X    for (c = ctab; c->name != NULL; c++) {
  3970. X        int len = strlen(c->name);
  3971. X
  3972. X        if (len > width)
  3973. X            width = len;
  3974. X        NCMDS++;
  3975. X    }
  3976. X    width = (width + 8) &~ 7;
  3977. X    if (s == 0) {
  3978. X        register int i, j, w;
  3979. X        int columns, lines;
  3980. X
  3981. X        lreply(214, "The following %scommands are recognized %s.",
  3982. X            type, "(* =>'s unimplemented)");
  3983. X        columns = 76 / width;
  3984. X        if (columns == 0)
  3985. X            columns = 1;
  3986. X        lines = (NCMDS + columns - 1) / columns;
  3987. X        for (i = 0; i < lines; i++) {
  3988. X            printf("   ");
  3989. X            for (j = 0; j < columns; j++) {
  3990. X                c = ctab + j * lines + i;
  3991. X                printf("%s%c", c->name,
  3992. X                    c->implemented ? ' ' : '*');
  3993. X                if (c + lines >= &ctab[NCMDS])
  3994. X                    break;
  3995. X                w = strlen(c->name) + 1;
  3996. X                while (w < width) {
  3997. X                    putchar(' ');
  3998. X                    w++;
  3999. X                }
  4000. X            }
  4001. X            printf("\r\n");
  4002. X        }
  4003. X        (void) fflush(stdout);
  4004. X        reply(214, "Direct comments to ftp-bugs@%s.", hostname);
  4005. X        return;
  4006. X    }
  4007. X    upper(s);
  4008. X    c = lookup(ctab, s);
  4009. X    if (c == (struct tab *)0) {
  4010. X        reply(502, "Unknown command %s.", s);
  4011. X        return;
  4012. X    }
  4013. X    if (c->implemented)
  4014. X        reply(214, "Syntax: %s%s %s", type, c->name, c->help);
  4015. X    else
  4016. X        reply(214, "%s%-*s\t%s; unimplemented.", type, width,
  4017. X            c->name, c->help);
  4018. X}
  4019. X
  4020. Xsizecmd(filename)
  4021. Xchar *filename;
  4022. X{
  4023. X    switch (type) {
  4024. X    case TYPE_L:
  4025. X    case TYPE_I: {
  4026. X        struct stat stbuf;
  4027. X        if (stat(filename, &stbuf) < 0 ||
  4028. X            (stbuf.st_mode&S_IFMT) != S_IFREG)
  4029. X            reply(550, "%s: not a plain file.", filename);
  4030. X        else
  4031. X            reply(213, "%lu", stbuf.st_size);
  4032. X        break;}
  4033. X    case TYPE_A: {
  4034. X        FILE *fin;
  4035. X        register int c, count;
  4036. X        struct stat stbuf;
  4037. X        fin = fopen(filename, "r");
  4038. X        if (fin == NULL) {
  4039. X            perror_reply(550, filename);
  4040. X            return;
  4041. X        }
  4042. X        if (fstat(fileno(fin), &stbuf) < 0 ||
  4043. X            (stbuf.st_mode&S_IFMT) != S_IFREG) {
  4044. X            reply(550, "%s: not a plain file.", filename);
  4045. X            (void) fclose(fin);
  4046. X            return;
  4047. X        }
  4048. X
  4049. X        count = 0;
  4050. X        while((c=getc(fin)) != EOF) {
  4051. X            if (c == '\n')    /* will get expanded to \r\n */
  4052. X                count++;
  4053. X            count++;
  4054. X        }
  4055. X        (void) fclose(fin);
  4056. X
  4057. X        reply(213, "%ld", count);
  4058. X        break;}
  4059. X    default:
  4060. X        reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
  4061. X    }
  4062. X}
  4063. END_OF_FILE
  4064. if test 22998 -ne `wc -c <'test/ftp.y'`; then
  4065.     echo shar: \"'test/ftp.y'\" unpacked with wrong size!
  4066. fi
  4067. # end of 'test/ftp.y'
  4068. fi
  4069. echo shar: End of archive 2 \(of 3\).
  4070. cp /dev/null ark2isdone
  4071. MISSING=""
  4072. for I in 1 2 3 ; do
  4073.     if test ! -f ark${I}isdone ; then
  4074.     MISSING="${MISSING} ${I}"
  4075.     fi
  4076. done
  4077. if test "${MISSING}" = "" ; then
  4078.     echo You have unpacked all 3 archives.
  4079.     rm -f ark[1-9]isdone
  4080. else
  4081.     echo You still need to unpack the following archives:
  4082.     echo "        " ${MISSING}
  4083. fi
  4084. ##  End of shell archive.
  4085. exit 0
  4086.