home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2808 < prev    next >
Internet Message Format  |  1991-02-19  |  62KB

  1. From: guido@cwi.nl (Guido van Rossum)
  2. Newsgroups: alt.sources
  3. Subject: Python 0.9.1 part 16/21
  4. Message-ID: <2978@charon.cwi.nl>
  5. Date: 19 Feb 91 17:42:30 GMT
  6.  
  7. : This is a shell archive.
  8. : Extract with 'sh this_file'.
  9. :
  10. : Extract part 01 first since it makes all directories
  11. echo 'Start of pack.out, part 16 out of 21:'
  12. if test -s 'demo/sgi/gl_panel/flying/materials.s'
  13. then echo '*** I will not over-write existing file demo/sgi/gl_panel/flying/materials.s'
  14. else
  15. echo 'x - demo/sgi/gl_panel/flying/materials.s'
  16. sed 's/^X//' > 'demo/sgi/gl_panel/flying/materials.s' << 'EOF'
  17. X;;; This file was automatically generated by the panel editor.
  18. X;;; If you read it into gnu emacs, it will automagically format itself.
  19. X
  20. X(panel (prop help creator:user-panel-help)
  21. X(prop user-panel #t)
  22. X(label "Materials")
  23. X(al (pnl_label (prop help creator:user-act-help)
  24. X(label "specular")
  25. X(x 4)
  26. X(y 0.5)
  27. X(downfunc move-then-resize)
  28. X)
  29. X(pnl_label (prop help creator:user-act-help)
  30. X(label "diffuse")
  31. X(x 4)
  32. X(y 4)
  33. X(downfunc move-then-resize)
  34. X)
  35. X(pnl_radio_button (name "m7")
  36. X(prop help creator:user-act-help)
  37. X(label "material 7")
  38. X(x 6.5)
  39. X(y 1.5)
  40. X(h 0.36)
  41. X(downfunc move-then-resize)
  42. X)
  43. X(pnl_radio_button (name "m9")
  44. X(prop help creator:user-act-help)
  45. X(label "material 9")
  46. X(x 6.5)
  47. X(y 0.5)
  48. X(h 0.36)
  49. X(downfunc move-then-resize)
  50. X)
  51. X(pnl_radio_button (name "m8")
  52. X(prop help creator:user-act-help)
  53. X(label "material 8")
  54. X(x 6.5)
  55. X(y 1)
  56. X(h 0.36)
  57. X(downfunc move-then-resize)
  58. X)
  59. X(pnl_radio_button (name "m6")
  60. X(prop help creator:user-act-help)
  61. X(label "material 6")
  62. X(x 6.5)
  63. X(y 2)
  64. X(h 0.36)
  65. X(downfunc move-then-resize)
  66. X)
  67. X(pnl_radio_button (name "m5")
  68. X(prop help creator:user-act-help)
  69. X(label "material 5")
  70. X(x 6.5)
  71. X(y 2.5)
  72. X(h 0.36)
  73. X(downfunc move-then-resize)
  74. X)
  75. X(pnl_radio_button  (name "m4")
  76. X(prop help creator:user-act-help)
  77. X(label "material 4")
  78. X(x 6.5)
  79. X(y 3)
  80. X(h 0.36)
  81. X(downfunc move-then-resize)
  82. X)
  83. X(pnl_radio_button (name "m3")
  84. X(prop help creator:user-act-help)
  85. X(label "material 3")
  86. X(x 6.5)
  87. X(y 3.5)
  88. X(h 0.36)
  89. X(downfunc move-then-resize)
  90. X)
  91. X(pnl_radio_button (name "m2")
  92. X(prop help creator:user-act-help)
  93. X(label "material 2")
  94. X(x 6.5)
  95. X(y 4)
  96. X(h 0.36)
  97. X(downfunc move-then-resize)
  98. X)
  99. X(pnl_radio_button  (name "m1")
  100. X(prop help creator:user-act-help)
  101. X(label "material 1")
  102. X(x 6.5)
  103. X(y 4.5)
  104. X(h 0.36)
  105. X(downfunc move-then-resize)
  106. X)
  107. X(pnl_filled_hslider (name "diffB")
  108. X(prop help creator:user-act-help)
  109. X(label "B")
  110. X(y 3.5)
  111. X(w 3.3)
  112. X(h 0.4)
  113. X(labeltype 0)
  114. X(downfunc move-then-resize)
  115. X)
  116. X(pnl_filled_hslider (name "diffG")
  117. X(prop help creator:user-act-help)
  118. X(label "G")
  119. X(y 4)
  120. X(w 3.3)
  121. X(h 0.4)
  122. X(labeltype 0)
  123. X(downfunc move-then-resize)
  124. X)
  125. X(pnl_filled_hslider (name "diffR")
  126. X(prop help creator:user-act-help)
  127. X(label "R")
  128. X(y 4.5)
  129. X(w 3.3)
  130. X(h 0.4)
  131. X(labeltype 0)
  132. X(downfunc move-then-resize)
  133. X)
  134. X(pnl_filled_hslider (name "specB")
  135. X(prop help creator:user-act-help)
  136. X(label "B")
  137. X(w 3.3)
  138. X(h 0.4)
  139. X(labeltype 0)
  140. X(downfunc move-then-resize)
  141. X)
  142. X(pnl_filled_hslider (name "specG")
  143. X(prop help creator:user-act-help)
  144. X(label "G")
  145. X(y 0.5)
  146. X(w 3.3)
  147. X(h 0.4)
  148. X(labeltype 0)
  149. X(downfunc move-then-resize)
  150. X)
  151. X(pnl_filled_hslider (name "specR")
  152. X(prop help creator:user-act-help)
  153. X(label "R")
  154. X(y 1)
  155. X(w 3.3)
  156. X(h 0.4)
  157. X(labeltype 0)
  158. X(downfunc move-then-resize)
  159. X)
  160. X(pnl_filled_hslider (name "shine")
  161. X(prop help creator:user-act-help)
  162. X(label "shininess")
  163. X(y 2.25)
  164. X(w 3.3)
  165. X(h 0.4)
  166. X(labeltype 0)
  167. X(downfunc move-then-resize)
  168. X)
  169. X)
  170. X)
  171. X;;; Local Variables:
  172. X;;; mode: scheme
  173. X;;; eval: (save-excursion (goto-char (point-min)) (kill-line 3))
  174. X;;; eval: (save-excursion (goto-char (point-min)) (replace-regexp "[ \n]*)" ")"))
  175. X;;; eval: (indent-region (point-min) (point-max) nil)
  176. X;;; eval: (progn (kill-line -3) (delete-backward-char 1) (save-buffer))
  177. X;;; End:
  178. EOF
  179. fi
  180. if test -s 'src/config.c'
  181. then echo '*** I will not over-write existing file src/config.c'
  182. else
  183. echo 'x - src/config.c'
  184. sed 's/^X//' > 'src/config.c' << 'EOF'
  185. X/***********************************************************
  186. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  187. XNetherlands.
  188. X
  189. X                        All Rights Reserved
  190. X
  191. XPermission to use, copy, modify, and distribute this software and its 
  192. Xdocumentation for any purpose and without fee is hereby granted, 
  193. Xprovided that the above copyright notice appear in all copies and that
  194. Xboth that copyright notice and this permission notice appear in 
  195. Xsupporting documentation, and that the names of Stichting Mathematisch
  196. XCentrum or CWI not be used in advertising or publicity pertaining to
  197. Xdistribution of the software without specific, written prior permission.
  198. X
  199. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  200. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  201. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  202. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  203. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  204. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  205. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  206. X
  207. X******************************************************************/
  208. X
  209. X/* Configurable Python configuration file */
  210. X
  211. X#include <stdio.h>
  212. X
  213. X#ifdef USE_STDWIN
  214. X#include <stdwin.h>
  215. X
  216. Xstatic int use_stdwin;
  217. X#endif
  218. X
  219. X/*ARGSUSED*/
  220. Xvoid
  221. Xinitargs(p_argc, p_argv)
  222. X    int *p_argc;
  223. X    char ***p_argv;
  224. X{
  225. X#ifdef USE_STDWIN
  226. X    extern char *getenv();
  227. X    char *display;
  228. X
  229. X    /* Ignore an initial argument of '-s', for backward compatibility */
  230. X    if (*p_argc > 1 && strcmp((*p_argv)[1], "-s") == 0) {
  231. X        (*p_argv)[1] = (*p_argv)[0];
  232. X        (*p_argc)--, (*p_argv)++;
  233. X    }
  234. X
  235. X    /* Assume we have to initialize stdwin if either of the following
  236. X       conditions holds:
  237. X       - the environment variable $DISPLAY is set
  238. X       - there is an argument "-display" somewhere
  239. X    */
  240. X    
  241. X    display = getenv("DISPLAY");
  242. X    if (display != 0)
  243. X        use_stdwin = 1;
  244. X    else {
  245. X        int i;
  246. X        /* Scan through the arguments looking for "-display" */
  247. X        for (i = 1; i < *p_argc; i++) {
  248. X            if (strcmp((*p_argv)[i], "-display") == 0) {
  249. X                use_stdwin = 1;
  250. X                break;
  251. X            }
  252. X        }
  253. X    }
  254. X    
  255. X    if (use_stdwin)
  256. X        wargs(p_argc, p_argv);
  257. X#endif
  258. X}
  259. X
  260. Xvoid
  261. Xinitcalls()
  262. X{
  263. X}
  264. X
  265. Xvoid
  266. Xdonecalls()
  267. X{
  268. X#ifdef USE_STDWIN
  269. X    if (use_stdwin)
  270. X        wdone();
  271. X#endif
  272. X#ifdef USE_AUDIO
  273. X    asa_done();
  274. X#endif
  275. X}
  276. X
  277. X#ifdef USE_STDWIN
  278. Xstatic void
  279. Xmaybeinitstdwin()
  280. X{
  281. X    if (use_stdwin)
  282. X        initstdwin();
  283. X    else
  284. X        fprintf(stderr,
  285. X         "No $DISPLAY nor -display arg -- stdwin not available\n");
  286. X}
  287. X#endif
  288. X
  289. X#ifndef PYTHONPATH
  290. X#define PYTHONPATH ".:/usr/local/lib/python"
  291. X#endif
  292. X
  293. Xextern char *getenv();
  294. X
  295. Xchar *
  296. Xgetpythonpath()
  297. X{
  298. X    char *path = getenv("PYTHONPATH");
  299. X    if (path == 0)
  300. X        path = PYTHONPATH;
  301. X    return path;
  302. X}
  303. X
  304. X
  305. X/* Table of built-in modules.
  306. X   These are initialized when first imported. */
  307. X
  308. X/* Standard modules */
  309. Xextern void inittime();
  310. Xextern void initmath();
  311. Xextern void initregexp();
  312. Xextern void initposix();
  313. X#ifdef USE_AUDIO
  314. Xextern void initaudio();
  315. X#endif
  316. X#ifdef USE_AMOEBA
  317. Xextern void initamoeba();
  318. X#endif
  319. X#ifdef USE_GL
  320. Xextern void initgl();
  321. X#ifdef USE_PANEL
  322. Xextern void initpanel();
  323. X#endif
  324. X#endif
  325. X#ifdef USE_STDWIN
  326. Xextern void maybeinitstdwin();
  327. X#endif
  328. X
  329. Xstruct {
  330. X    char *name;
  331. X    void (*initfunc)();
  332. X} inittab[] = {
  333. X
  334. X    /* Standard modules */
  335. X
  336. X    {"time",    inittime},
  337. X    {"math",    initmath},
  338. X    {"regexp",    initregexp},
  339. X    {"posix",    initposix},
  340. X
  341. X
  342. X    /* Optional modules */
  343. X
  344. X#ifdef USE_AUDIO
  345. X    {"audio",    initaudio},
  346. X#endif
  347. X
  348. X#ifdef USE_AMOEBA
  349. X    {"amoeba",    initamoeba},
  350. X#endif
  351. X
  352. X#ifdef USE_GL
  353. X    {"gl",        initgl},
  354. X#ifdef USE_PANEL
  355. X    {"pnl",        initpanel},
  356. X#endif
  357. X#endif
  358. X
  359. X#ifdef USE_STDWIN
  360. X    {"stdwin",    maybeinitstdwin},
  361. X#endif
  362. X
  363. X    {0,        0}        /* Sentinel */
  364. X};
  365. EOF
  366. fi
  367. if test -s 'src/frameobject.c'
  368. then echo '*** I will not over-write existing file src/frameobject.c'
  369. else
  370. echo 'x - src/frameobject.c'
  371. sed 's/^X//' > 'src/frameobject.c' << 'EOF'
  372. X/***********************************************************
  373. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  374. XNetherlands.
  375. X
  376. X                        All Rights Reserved
  377. X
  378. XPermission to use, copy, modify, and distribute this software and its 
  379. Xdocumentation for any purpose and without fee is hereby granted, 
  380. Xprovided that the above copyright notice appear in all copies and that
  381. Xboth that copyright notice and this permission notice appear in 
  382. Xsupporting documentation, and that the names of Stichting Mathematisch
  383. XCentrum or CWI not be used in advertising or publicity pertaining to
  384. Xdistribution of the software without specific, written prior permission.
  385. X
  386. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  387. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  388. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  389. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  390. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  391. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  392. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  393. X
  394. X******************************************************************/
  395. X
  396. X/* Frame object implementation */
  397. X
  398. X#include "allobjects.h"
  399. X
  400. X#include "compile.h"
  401. X#include "frameobject.h"
  402. X#include "opcode.h"
  403. X#include "structmember.h"
  404. X
  405. X#define OFF(x) offsetof(frameobject, x)
  406. X
  407. Xstatic struct memberlist frame_memberlist[] = {
  408. X    {"f_back",    T_OBJECT,    OFF(f_back)},
  409. X    {"f_code",    T_OBJECT,    OFF(f_code)},
  410. X    {"f_globals",    T_OBJECT,    OFF(f_globals)},
  411. X    {"f_locals",    T_OBJECT,    OFF(f_locals)},
  412. X    {NULL}    /* Sentinel */
  413. X};
  414. X
  415. Xstatic object *
  416. Xframe_getattr(f, name)
  417. X    frameobject *f;
  418. X    char *name;
  419. X{
  420. X    return getmember((char *)f, frame_memberlist, name);
  421. X}
  422. X
  423. Xstatic void
  424. Xframe_dealloc(f)
  425. X    frameobject *f;
  426. X{
  427. X    XDECREF(f->f_back);
  428. X    XDECREF(f->f_code);
  429. X    XDECREF(f->f_globals);
  430. X    XDECREF(f->f_locals);
  431. X    XDEL(f->f_valuestack);
  432. X    XDEL(f->f_blockstack);
  433. X    DEL(f);
  434. X}
  435. X
  436. Xtypeobject Frametype = {
  437. X    OB_HEAD_INIT(&Typetype)
  438. X    0,
  439. X    "frame",
  440. X    sizeof(frameobject),
  441. X    0,
  442. X    frame_dealloc,    /*tp_dealloc*/
  443. X    0,        /*tp_print*/
  444. X    frame_getattr,    /*tp_getattr*/
  445. X    0,        /*tp_setattr*/
  446. X    0,        /*tp_compare*/
  447. X    0,        /*tp_repr*/
  448. X    0,        /*tp_as_number*/
  449. X    0,        /*tp_as_sequence*/
  450. X    0,        /*tp_as_mapping*/
  451. X};
  452. X
  453. Xframeobject *
  454. Xnewframeobject(back, code, globals, locals, nvalues, nblocks)
  455. X    frameobject *back;
  456. X    codeobject *code;
  457. X    object *globals;
  458. X    object *locals;
  459. X    int nvalues;
  460. X    int nblocks;
  461. X{
  462. X    frameobject *f;
  463. X    if ((back != NULL && !is_frameobject(back)) ||
  464. X        code == NULL || !is_codeobject(code) ||
  465. X        globals == NULL || !is_dictobject(globals) ||
  466. X        locals == NULL || !is_dictobject(locals) ||
  467. X        nvalues < 0 || nblocks < 0) {
  468. X        err_badcall();
  469. X        return NULL;
  470. X    }
  471. X    f = NEWOBJ(frameobject, &Frametype);
  472. X    if (f != NULL) {
  473. X        if (back)
  474. X            INCREF(back);
  475. X        f->f_back = back;
  476. X        INCREF(code);
  477. X        f->f_code = code;
  478. X        INCREF(globals);
  479. X        f->f_globals = globals;
  480. X        INCREF(locals);
  481. X        f->f_locals = locals;
  482. X        f->f_valuestack = NEW(object *, nvalues+1);
  483. X        f->f_blockstack = NEW(block, nblocks+1);
  484. X        f->f_nvalues = nvalues;
  485. X        f->f_nblocks = nblocks;
  486. X        f->f_iblock = 0;
  487. X        if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
  488. X            err_nomem();
  489. X            DECREF(f);
  490. X            f = NULL;
  491. X        }
  492. X    }
  493. X    return f;
  494. X}
  495. X
  496. X/* Block management */
  497. X
  498. Xvoid
  499. Xsetup_block(f, type, handler, level)
  500. X    frameobject *f;
  501. X    int type;
  502. X    int handler;
  503. X    int level;
  504. X{
  505. X    block *b;
  506. X    if (f->f_iblock >= f->f_nblocks) {
  507. X        fprintf(stderr, "XXX block stack overflow\n");
  508. X        abort();
  509. X    }
  510. X    b = &f->f_blockstack[f->f_iblock++];
  511. X    b->b_type = type;
  512. X    b->b_level = level;
  513. X    b->b_handler = handler;
  514. X}
  515. X
  516. Xblock *
  517. Xpop_block(f)
  518. X    frameobject *f;
  519. X{
  520. X    block *b;
  521. X    if (f->f_iblock <= 0) {
  522. X        fprintf(stderr, "XXX block stack underflow\n");
  523. X        abort();
  524. X    }
  525. X    b = &f->f_blockstack[--f->f_iblock];
  526. X    return b;
  527. X}
  528. EOF
  529. fi
  530. if test -s 'src/metagrammar.c'
  531. then echo '*** I will not over-write existing file src/metagrammar.c'
  532. else
  533. echo 'x - src/metagrammar.c'
  534. sed 's/^X//' > 'src/metagrammar.c' << 'EOF'
  535. X/***********************************************************
  536. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  537. XNetherlands.
  538. X
  539. X                        All Rights Reserved
  540. X
  541. XPermission to use, copy, modify, and distribute this software and its 
  542. Xdocumentation for any purpose and without fee is hereby granted, 
  543. Xprovided that the above copyright notice appear in all copies and that
  544. Xboth that copyright notice and this permission notice appear in 
  545. Xsupporting documentation, and that the names of Stichting Mathematisch
  546. XCentrum or CWI not be used in advertising or publicity pertaining to
  547. Xdistribution of the software without specific, written prior permission.
  548. X
  549. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  550. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  551. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  552. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  553. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  554. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  555. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  556. X
  557. X******************************************************************/
  558. X
  559. X#include "pgenheaders.h"
  560. X#include "metagrammar.h"
  561. X#include "grammar.h"
  562. X#include "pgen.h"
  563. Xstatic arc arcs_0_0[3] = {
  564. X    {2, 0},
  565. X    {3, 0},
  566. X    {4, 1},
  567. X};
  568. Xstatic arc arcs_0_1[1] = {
  569. X    {0, 1},
  570. X};
  571. Xstatic state states_0[2] = {
  572. X    {3, arcs_0_0},
  573. X    {1, arcs_0_1},
  574. X};
  575. Xstatic arc arcs_1_0[1] = {
  576. X    {5, 1},
  577. X};
  578. Xstatic arc arcs_1_1[1] = {
  579. X    {6, 2},
  580. X};
  581. Xstatic arc arcs_1_2[1] = {
  582. X    {7, 3},
  583. X};
  584. Xstatic arc arcs_1_3[1] = {
  585. X    {3, 4},
  586. X};
  587. Xstatic arc arcs_1_4[1] = {
  588. X    {0, 4},
  589. X};
  590. Xstatic state states_1[5] = {
  591. X    {1, arcs_1_0},
  592. X    {1, arcs_1_1},
  593. X    {1, arcs_1_2},
  594. X    {1, arcs_1_3},
  595. X    {1, arcs_1_4},
  596. X};
  597. Xstatic arc arcs_2_0[1] = {
  598. X    {8, 1},
  599. X};
  600. Xstatic arc arcs_2_1[2] = {
  601. X    {9, 0},
  602. X    {0, 1},
  603. X};
  604. Xstatic state states_2[2] = {
  605. X    {1, arcs_2_0},
  606. X    {2, arcs_2_1},
  607. X};
  608. Xstatic arc arcs_3_0[1] = {
  609. X    {10, 1},
  610. X};
  611. Xstatic arc arcs_3_1[2] = {
  612. X    {10, 1},
  613. X    {0, 1},
  614. X};
  615. Xstatic state states_3[2] = {
  616. X    {1, arcs_3_0},
  617. X    {2, arcs_3_1},
  618. X};
  619. Xstatic arc arcs_4_0[2] = {
  620. X    {11, 1},
  621. X    {13, 2},
  622. X};
  623. Xstatic arc arcs_4_1[1] = {
  624. X    {7, 3},
  625. X};
  626. Xstatic arc arcs_4_2[3] = {
  627. X    {14, 4},
  628. X    {15, 4},
  629. X    {0, 2},
  630. X};
  631. Xstatic arc arcs_4_3[1] = {
  632. X    {12, 4},
  633. X};
  634. Xstatic arc arcs_4_4[1] = {
  635. X    {0, 4},
  636. X};
  637. Xstatic state states_4[5] = {
  638. X    {2, arcs_4_0},
  639. X    {1, arcs_4_1},
  640. X    {3, arcs_4_2},
  641. X    {1, arcs_4_3},
  642. X    {1, arcs_4_4},
  643. X};
  644. Xstatic arc arcs_5_0[3] = {
  645. X    {5, 1},
  646. X    {16, 1},
  647. X    {17, 2},
  648. X};
  649. Xstatic arc arcs_5_1[1] = {
  650. X    {0, 1},
  651. X};
  652. Xstatic arc arcs_5_2[1] = {
  653. X    {7, 3},
  654. X};
  655. Xstatic arc arcs_5_3[1] = {
  656. X    {18, 1},
  657. X};
  658. Xstatic state states_5[4] = {
  659. X    {3, arcs_5_0},
  660. X    {1, arcs_5_1},
  661. X    {1, arcs_5_2},
  662. X    {1, arcs_5_3},
  663. X};
  664. Xstatic dfa dfas[6] = {
  665. X    {256, "MSTART", 0, 2, states_0,
  666. X     "\070\000\000"},
  667. X    {257, "RULE", 0, 5, states_1,
  668. X     "\040\000\000"},
  669. X    {258, "RHS", 0, 2, states_2,
  670. X     "\040\010\003"},
  671. X    {259, "ALT", 0, 2, states_3,
  672. X     "\040\010\003"},
  673. X    {260, "ITEM", 0, 5, states_4,
  674. X     "\040\010\003"},
  675. X    {261, "ATOM", 0, 4, states_5,
  676. X     "\040\000\003"},
  677. X};
  678. Xstatic label labels[19] = {
  679. X    {0, "EMPTY"},
  680. X    {256, 0},
  681. X    {257, 0},
  682. X    {4, 0},
  683. X    {0, 0},
  684. X    {1, 0},
  685. X    {11, 0},
  686. X    {258, 0},
  687. X    {259, 0},
  688. X    {18, 0},
  689. X    {260, 0},
  690. X    {9, 0},
  691. X    {10, 0},
  692. X    {261, 0},
  693. X    {16, 0},
  694. X    {14, 0},
  695. X    {3, 0},
  696. X    {7, 0},
  697. X    {8, 0},
  698. X};
  699. Xstatic grammar gram = {
  700. X    6,
  701. X    dfas,
  702. X    {19, labels},
  703. X    256
  704. X};
  705. X
  706. Xgrammar *
  707. Xmeta_grammar()
  708. X{
  709. X    return &gram;
  710. X}
  711. EOF
  712. fi
  713. if test -s 'src/methodobject.c'
  714. then echo '*** I will not over-write existing file src/methodobject.c'
  715. else
  716. echo 'x - src/methodobject.c'
  717. sed 's/^X//' > 'src/methodobject.c' << 'EOF'
  718. X/***********************************************************
  719. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  720. XNetherlands.
  721. X
  722. X                        All Rights Reserved
  723. X
  724. XPermission to use, copy, modify, and distribute this software and its 
  725. Xdocumentation for any purpose and without fee is hereby granted, 
  726. Xprovided that the above copyright notice appear in all copies and that
  727. Xboth that copyright notice and this permission notice appear in 
  728. Xsupporting documentation, and that the names of Stichting Mathematisch
  729. XCentrum or CWI not be used in advertising or publicity pertaining to
  730. Xdistribution of the software without specific, written prior permission.
  731. X
  732. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  733. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  734. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  735. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  736. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  737. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  738. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  739. X
  740. X******************************************************************/
  741. X
  742. X/* Method object implementation */
  743. X
  744. X#include "allobjects.h"
  745. X
  746. X#include "token.h"
  747. X
  748. Xtypedef struct {
  749. X    OB_HEAD
  750. X    char *m_name;
  751. X    method m_meth;
  752. X    object *m_self;
  753. X} methodobject;
  754. X
  755. Xobject *
  756. Xnewmethodobject(name, meth, self)
  757. X    char *name; /* static string */
  758. X    method meth;
  759. X    object *self;
  760. X{
  761. X    methodobject *op = NEWOBJ(methodobject, &Methodtype);
  762. X    if (op != NULL) {
  763. X        op->m_name = name;
  764. X        op->m_meth = meth;
  765. X        if (self != NULL)
  766. X            INCREF(self);
  767. X        op->m_self = self;
  768. X    }
  769. X    return (object *)op;
  770. X}
  771. X
  772. Xmethod
  773. Xgetmethod(op)
  774. X    object *op;
  775. X{
  776. X    if (!is_methodobject(op)) {
  777. X        err_badcall();
  778. X        return NULL;
  779. X    }
  780. X    return ((methodobject *)op) -> m_meth;
  781. X}
  782. X
  783. Xobject *
  784. Xgetself(op)
  785. X    object *op;
  786. X{
  787. X    if (!is_methodobject(op)) {
  788. X        err_badcall();
  789. X        return NULL;
  790. X    }
  791. X    return ((methodobject *)op) -> m_self;
  792. X}
  793. X
  794. X/* Methods (the standard built-in methods, that is) */
  795. X
  796. Xstatic void
  797. Xmeth_dealloc(m)
  798. X    methodobject *m;
  799. X{
  800. X    if (m->m_self != NULL)
  801. X        DECREF(m->m_self);
  802. X    free((char *)m);
  803. X}
  804. X
  805. Xstatic void
  806. Xmeth_print(m, fp, flags)
  807. X    methodobject *m;
  808. X    FILE *fp;
  809. X    int flags;
  810. X{
  811. X    if (m->m_self == NULL)
  812. X        fprintf(fp, "<built-in function '%s'>", m->m_name);
  813. X    else
  814. X        fprintf(fp, "<built-in method '%s' of some %s object>",
  815. X            m->m_name, m->m_self->ob_type->tp_name);
  816. X}
  817. X
  818. Xstatic object *
  819. Xmeth_repr(m)
  820. X    methodobject *m;
  821. X{
  822. X    char buf[200];
  823. X    if (m->m_self == NULL)
  824. X        sprintf(buf, "<built-in function '%.80s'>", m->m_name);
  825. X    else
  826. X        sprintf(buf,
  827. X            "<built-in method '%.80s' of some %.80s object>",
  828. X            m->m_name, m->m_self->ob_type->tp_name);
  829. X    return newstringobject(buf);
  830. X}
  831. X
  832. Xtypeobject Methodtype = {
  833. X    OB_HEAD_INIT(&Typetype)
  834. X    0,
  835. X    "method",
  836. X    sizeof(methodobject),
  837. X    0,
  838. X    meth_dealloc,    /*tp_dealloc*/
  839. X    meth_print,    /*tp_print*/
  840. X    0,        /*tp_getattr*/
  841. X    0,        /*tp_setattr*/
  842. X    0,        /*tp_compare*/
  843. X    meth_repr,    /*tp_repr*/
  844. X    0,        /*tp_as_number*/
  845. X    0,        /*tp_as_sequence*/
  846. X    0,        /*tp_as_mapping*/
  847. X};
  848. X
  849. X/* Find a method in a module's method table.
  850. X   Usually called from an object's getattr method. */
  851. X
  852. Xobject *
  853. Xfindmethod(ml, op, name)
  854. X    struct methodlist *ml;
  855. X    object *op;
  856. X    char *name;
  857. X{
  858. X    for (; ml->ml_name != NULL; ml++) {
  859. X        if (strcmp(name, ml->ml_name) == 0)
  860. X            return newmethodobject(ml->ml_name, ml->ml_meth, op);
  861. X    }
  862. X    err_setstr(NameError, name);
  863. X    return NULL;
  864. X}
  865. EOF
  866. fi
  867. if test -s 'src/moduleobject.c'
  868. then echo '*** I will not over-write existing file src/moduleobject.c'
  869. else
  870. echo 'x - src/moduleobject.c'
  871. sed 's/^X//' > 'src/moduleobject.c' << 'EOF'
  872. X/***********************************************************
  873. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  874. XNetherlands.
  875. X
  876. X                        All Rights Reserved
  877. X
  878. XPermission to use, copy, modify, and distribute this software and its 
  879. Xdocumentation for any purpose and without fee is hereby granted, 
  880. Xprovided that the above copyright notice appear in all copies and that
  881. Xboth that copyright notice and this permission notice appear in 
  882. Xsupporting documentation, and that the names of Stichting Mathematisch
  883. XCentrum or CWI not be used in advertising or publicity pertaining to
  884. Xdistribution of the software without specific, written prior permission.
  885. X
  886. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  887. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  888. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  889. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  890. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  891. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  892. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  893. X
  894. X******************************************************************/
  895. X
  896. X/* Module object implementation */
  897. X
  898. X#include "allobjects.h"
  899. X
  900. Xtypedef struct {
  901. X    OB_HEAD
  902. X    object *md_name;
  903. X    object *md_dict;
  904. X} moduleobject;
  905. X
  906. Xobject *
  907. Xnewmoduleobject(name)
  908. X    char *name;
  909. X{
  910. X    moduleobject *m = NEWOBJ(moduleobject, &Moduletype);
  911. X    if (m == NULL)
  912. X        return NULL;
  913. X    m->md_name = newstringobject(name);
  914. X    m->md_dict = newdictobject();
  915. X    if (m->md_name == NULL || m->md_dict == NULL) {
  916. X        DECREF(m);
  917. X        return NULL;
  918. X    }
  919. X    return (object *)m;
  920. X}
  921. X
  922. Xobject *
  923. Xgetmoduledict(m)
  924. X    object *m;
  925. X{
  926. X    if (!is_moduleobject(m)) {
  927. X        err_badcall();
  928. X        return NULL;
  929. X    }
  930. X    return ((moduleobject *)m) -> md_dict;
  931. X}
  932. X
  933. Xchar *
  934. Xgetmodulename(m)
  935. X    object *m;
  936. X{
  937. X    if (!is_moduleobject(m)) {
  938. X        err_badarg();
  939. X        return NULL;
  940. X    }
  941. X    return getstringvalue(((moduleobject *)m) -> md_name);
  942. X}
  943. X
  944. X/* Methods */
  945. X
  946. Xstatic void
  947. Xmodule_dealloc(m)
  948. X    moduleobject *m;
  949. X{
  950. X    if (m->md_name != NULL)
  951. X        DECREF(m->md_name);
  952. X    if (m->md_dict != NULL)
  953. X        DECREF(m->md_dict);
  954. X    free((char *)m);
  955. X}
  956. X
  957. Xstatic void
  958. Xmodule_print(m, fp, flags)
  959. X    moduleobject *m;
  960. X    FILE *fp;
  961. X    int flags;
  962. X{
  963. X    fprintf(fp, "<module '%s'>", getstringvalue(m->md_name));
  964. X}
  965. X
  966. Xstatic object *
  967. Xmodule_repr(m)
  968. X    moduleobject *m;
  969. X{
  970. X    char buf[100];
  971. X    sprintf(buf, "<module '%.80s'>", getstringvalue(m->md_name));
  972. X    return newstringobject(buf);
  973. X}
  974. X
  975. Xstatic object *
  976. Xmodule_getattr(m, name)
  977. X    moduleobject *m;
  978. X    char *name;
  979. X{
  980. X    object *res;
  981. X    if (strcmp(name, "__dict__") == 0) {
  982. X        INCREF(m->md_dict);
  983. X        return m->md_dict;
  984. X    }
  985. X    if (strcmp(name, "__name__") == 0) {
  986. X        INCREF(m->md_name);
  987. X        return m->md_name;
  988. X    }
  989. X    res = dictlookup(m->md_dict, name);
  990. X    if (res == NULL)
  991. X        err_setstr(NameError, name);
  992. X    else
  993. X        INCREF(res);
  994. X    return res;
  995. X}
  996. X
  997. Xstatic int
  998. Xmodule_setattr(m, name, v)
  999. X    moduleobject *m;
  1000. X    char *name;
  1001. X    object *v;
  1002. X{
  1003. X    if (strcmp(name, "__dict__") == 0 || strcmp(name, "__name__") == 0) {
  1004. X        err_setstr(NameError, "can't assign to reserved member name");
  1005. X        return -1;
  1006. X    }
  1007. X    if (v == NULL)
  1008. X        return dictremove(m->md_dict, name);
  1009. X    else
  1010. X        return dictinsert(m->md_dict, name, v);
  1011. X}
  1012. X
  1013. Xtypeobject Moduletype = {
  1014. X    OB_HEAD_INIT(&Typetype)
  1015. X    0,            /*ob_size*/
  1016. X    "module",        /*tp_name*/
  1017. X    sizeof(moduleobject),    /*tp_size*/
  1018. X    0,            /*tp_itemsize*/
  1019. X    module_dealloc,        /*tp_dealloc*/
  1020. X    module_print,        /*tp_print*/
  1021. X    module_getattr,        /*tp_getattr*/
  1022. X    module_setattr,        /*tp_setattr*/
  1023. X    0,            /*tp_compare*/
  1024. X    module_repr,        /*tp_repr*/
  1025. X};
  1026. EOF
  1027. fi
  1028. if test -s 'src/opcode.h'
  1029. then echo '*** I will not over-write existing file src/opcode.h'
  1030. else
  1031. echo 'x - src/opcode.h'
  1032. sed 's/^X//' > 'src/opcode.h' << 'EOF'
  1033. X/***********************************************************
  1034. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1035. XNetherlands.
  1036. X
  1037. X                        All Rights Reserved
  1038. X
  1039. XPermission to use, copy, modify, and distribute this software and its 
  1040. Xdocumentation for any purpose and without fee is hereby granted, 
  1041. Xprovided that the above copyright notice appear in all copies and that
  1042. Xboth that copyright notice and this permission notice appear in 
  1043. Xsupporting documentation, and that the names of Stichting Mathematisch
  1044. XCentrum or CWI not be used in advertising or publicity pertaining to
  1045. Xdistribution of the software without specific, written prior permission.
  1046. X
  1047. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1048. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1049. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1050. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1051. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1052. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1053. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1054. X
  1055. X******************************************************************/
  1056. X
  1057. X/* Instruction opcodes for compiled code */
  1058. X
  1059. X#define STOP_CODE    0
  1060. X#define POP_TOP        1
  1061. X#define ROT_TWO        2
  1062. X#define ROT_THREE    3
  1063. X#define DUP_TOP        4
  1064. X
  1065. X#define UNARY_POSITIVE    10
  1066. X#define UNARY_NEGATIVE    11
  1067. X#define UNARY_NOT    12
  1068. X#define UNARY_CONVERT    13
  1069. X#define UNARY_CALL    14
  1070. X
  1071. X#define BINARY_MULTIPLY    20
  1072. X#define BINARY_DIVIDE    21
  1073. X#define BINARY_MODULO    22
  1074. X#define BINARY_ADD    23
  1075. X#define BINARY_SUBTRACT    24
  1076. X#define BINARY_SUBSCR    25
  1077. X#define BINARY_CALL    26
  1078. X
  1079. X#define SLICE        30
  1080. X/* Also uses 31-33 */
  1081. X
  1082. X#define STORE_SLICE    40
  1083. X/* Also uses 41-43 */
  1084. X
  1085. X#define DELETE_SLICE    50
  1086. X/* Also uses 51-53 */
  1087. X
  1088. X#define STORE_SUBSCR    60
  1089. X#define DELETE_SUBSCR    61
  1090. X
  1091. X#define PRINT_EXPR    70
  1092. X#define PRINT_ITEM    71
  1093. X#define PRINT_NEWLINE    72
  1094. X
  1095. X#define BREAK_LOOP    80
  1096. X#define RAISE_EXCEPTION    81
  1097. X#define LOAD_LOCALS    82
  1098. X#define RETURN_VALUE    83
  1099. X#define REQUIRE_ARGS    84
  1100. X#define REFUSE_ARGS    85
  1101. X#define BUILD_FUNCTION    86
  1102. X#define POP_BLOCK    87
  1103. X#define END_FINALLY    88
  1104. X#define BUILD_CLASS    89
  1105. X
  1106. X#define HAVE_ARGUMENT    90    /* Opcodes from here have an argument: */
  1107. X
  1108. X#define STORE_NAME    90    /* Index in name list */
  1109. X#define DELETE_NAME    91    /* "" */
  1110. X#define UNPACK_TUPLE    92    /* Number of tuple items */
  1111. X#define UNPACK_LIST    93    /* Number of list items */
  1112. X/* unused:        94 */
  1113. X#define STORE_ATTR    95    /* Index in name list */
  1114. X#define DELETE_ATTR    96    /* "" */
  1115. X
  1116. X#define LOAD_CONST    100    /* Index in const list */
  1117. X#define LOAD_NAME    101    /* Index in name list */
  1118. X#define BUILD_TUPLE    102    /* Number of tuple items */
  1119. X#define BUILD_LIST    103    /* Number of list items */
  1120. X#define BUILD_MAP    104    /* Always zero for now */
  1121. X#define LOAD_ATTR    105    /* Index in name list */
  1122. X#define COMPARE_OP    106    /* Comparison operator */
  1123. X#define IMPORT_NAME    107    /* Index in name list */
  1124. X#define IMPORT_FROM    108    /* Index in name list */
  1125. X
  1126. X#define JUMP_FORWARD    110    /* Number of bytes to skip */
  1127. X#define JUMP_IF_FALSE    111    /* "" */
  1128. X#define JUMP_IF_TRUE    112    /* "" */
  1129. X#define JUMP_ABSOLUTE    113    /* Target byte offset from beginning of code */
  1130. X#define FOR_LOOP    114    /* Number of bytes to skip */
  1131. X
  1132. X#define SETUP_LOOP    120    /* Target address (absolute) */
  1133. X#define SETUP_EXCEPT    121    /* "" */
  1134. X#define SETUP_FINALLY    122    /* "" */
  1135. X
  1136. X#define SET_LINENO    127    /* Current line number */
  1137. X
  1138. X/* Comparison operator codes (argument to COMPARE_OP) */
  1139. Xenum cmp_op {LT, LE, EQ, NE, GT, GE, IN, NOT_IN, IS, IS_NOT, EXC_MATCH, BAD};
  1140. X
  1141. X#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
  1142. EOF
  1143. fi
  1144. if test -s 'src/parsetok.c'
  1145. then echo '*** I will not over-write existing file src/parsetok.c'
  1146. else
  1147. echo 'x - src/parsetok.c'
  1148. sed 's/^X//' > 'src/parsetok.c' << 'EOF'
  1149. X/***********************************************************
  1150. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1151. XNetherlands.
  1152. X
  1153. X                        All Rights Reserved
  1154. X
  1155. XPermission to use, copy, modify, and distribute this software and its 
  1156. Xdocumentation for any purpose and without fee is hereby granted, 
  1157. Xprovided that the above copyright notice appear in all copies and that
  1158. Xboth that copyright notice and this permission notice appear in 
  1159. Xsupporting documentation, and that the names of Stichting Mathematisch
  1160. XCentrum or CWI not be used in advertising or publicity pertaining to
  1161. Xdistribution of the software without specific, written prior permission.
  1162. X
  1163. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1164. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1165. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1166. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1167. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1168. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1169. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1170. X
  1171. X******************************************************************/
  1172. X
  1173. X/* Parser-tokenizer link implementation */
  1174. X
  1175. X#include "pgenheaders.h"
  1176. X#include "tokenizer.h"
  1177. X#include "node.h"
  1178. X#include "grammar.h"
  1179. X#include "parser.h"
  1180. X#include "parsetok.h"
  1181. X#include "errcode.h"
  1182. X
  1183. X
  1184. X/* Forward */
  1185. Xstatic int parsetok PROTO((struct tok_state *, grammar *, int, node **));
  1186. X
  1187. X
  1188. X/* Parse input coming from a string.  Return error code, print some errors. */
  1189. X
  1190. Xint
  1191. Xparsestring(s, g, start, n_ret)
  1192. X    char *s;
  1193. X    grammar *g;
  1194. X    int start;
  1195. X    node **n_ret;
  1196. X{
  1197. X    struct tok_state *tok = tok_setups(s);
  1198. X    int ret;
  1199. X    
  1200. X    if (tok == NULL) {
  1201. X        fprintf(stderr, "no mem for tok_setups\n");
  1202. X        return E_NOMEM;
  1203. X    }
  1204. X    ret = parsetok(tok, g, start, n_ret);
  1205. X    if (ret == E_TOKEN || ret == E_SYNTAX) {
  1206. X        fprintf(stderr, "String parsing error at line %d\n",
  1207. X            tok->lineno);
  1208. X    }
  1209. X    tok_free(tok);
  1210. X    return ret;
  1211. X}
  1212. X
  1213. X
  1214. X/* Parse input coming from a file.  Return error code, print some errors. */
  1215. X
  1216. Xint
  1217. Xparsefile(fp, filename, g, start, ps1, ps2, n_ret)
  1218. X    FILE *fp;
  1219. X    char *filename;
  1220. X    grammar *g;
  1221. X    int start;
  1222. X    char *ps1, *ps2;
  1223. X    node **n_ret;
  1224. X{
  1225. X    struct tok_state *tok = tok_setupf(fp, ps1, ps2);
  1226. X    int ret;
  1227. X    
  1228. X    if (tok == NULL) {
  1229. X        fprintf(stderr, "no mem for tok_setupf\n");
  1230. X        return E_NOMEM;
  1231. X    }
  1232. X    ret = parsetok(tok, g, start, n_ret);
  1233. X    if (ret == E_TOKEN || ret == E_SYNTAX) {
  1234. X        char *p;
  1235. X        fprintf(stderr, "Parsing error: file %s, line %d:\n",
  1236. X                        filename, tok->lineno);
  1237. X        *tok->inp = '\0';
  1238. X        if (tok->inp > tok->buf && tok->inp[-1] == '\n')
  1239. X            tok->inp[-1] = '\0';
  1240. X        fprintf(stderr, "%s\n", tok->buf);
  1241. X        for (p = tok->buf; p < tok->cur; p++) {
  1242. X            if (*p == '\t')
  1243. X                putc('\t', stderr);
  1244. X            else
  1245. X                putc(' ', stderr);
  1246. X        }
  1247. X        fprintf(stderr, "^\n");
  1248. X    }
  1249. X    tok_free(tok);
  1250. X    return ret;
  1251. X}
  1252. X
  1253. X
  1254. X/* Parse input coming from the given tokenizer structure.
  1255. X   Return error code. */
  1256. X
  1257. Xstatic int
  1258. Xparsetok(tok, g, start, n_ret)
  1259. X    struct tok_state *tok;
  1260. X    grammar *g;
  1261. X    int start;
  1262. X    node **n_ret;
  1263. X{
  1264. X    parser_state *ps;
  1265. X    int ret;
  1266. X    
  1267. X    if ((ps = newparser(g, start)) == NULL) {
  1268. X        fprintf(stderr, "no mem for new parser\n");
  1269. X        return E_NOMEM;
  1270. X    }
  1271. X    
  1272. X    for (;;) {
  1273. X        char *a, *b;
  1274. X        int type;
  1275. X        int len;
  1276. X        char *str;
  1277. X        
  1278. X        type = tok_get(tok, &a, &b);
  1279. X        if (type == ERRORTOKEN) {
  1280. X            ret = tok->done;
  1281. X            break;
  1282. X        }
  1283. X        len = b - a;
  1284. X        str = NEW(char, len + 1);
  1285. X        if (str == NULL) {
  1286. X            fprintf(stderr, "no mem for next token\n");
  1287. X            ret = E_NOMEM;
  1288. X            break;
  1289. X        }
  1290. X        strncpy(str, a, len);
  1291. X        str[len] = '\0';
  1292. X        ret = addtoken(ps, (int)type, str, tok->lineno);
  1293. X        if (ret != E_OK) {
  1294. X            if (ret == E_DONE) {
  1295. X                *n_ret = ps->p_tree;
  1296. X                ps->p_tree = NULL;
  1297. X            }
  1298. X            else if (tok->lineno <= 1 && tok->done == E_EOF)
  1299. X                ret = E_EOF;
  1300. X            break;
  1301. X        }
  1302. X    }
  1303. X    
  1304. X    delparser(ps);
  1305. X    return ret;
  1306. X}
  1307. EOF
  1308. fi
  1309. if test -s 'src/pgenmain.c'
  1310. then echo '*** I will not over-write existing file src/pgenmain.c'
  1311. else
  1312. echo 'x - src/pgenmain.c'
  1313. sed 's/^X//' > 'src/pgenmain.c' << 'EOF'
  1314. X/***********************************************************
  1315. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1316. XNetherlands.
  1317. X
  1318. X                        All Rights Reserved
  1319. X
  1320. XPermission to use, copy, modify, and distribute this software and its 
  1321. Xdocumentation for any purpose and without fee is hereby granted, 
  1322. Xprovided that the above copyright notice appear in all copies and that
  1323. Xboth that copyright notice and this permission notice appear in 
  1324. Xsupporting documentation, and that the names of Stichting Mathematisch
  1325. XCentrum or CWI not be used in advertising or publicity pertaining to
  1326. Xdistribution of the software without specific, written prior permission.
  1327. X
  1328. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1329. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1330. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1331. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1332. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1333. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1334. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1335. X
  1336. X******************************************************************/
  1337. X
  1338. X/* Parser generator main program */
  1339. X
  1340. X/* This expects a filename containing the grammar as argv[1] (UNIX)
  1341. X   or asks the console for such a file name (THINK C).
  1342. X   It writes its output on two files in the current directory:
  1343. X   - "graminit.c" gets the grammar as a bunch of initialized data
  1344. X   - "graminit.h" gets the grammar's non-terminals as #defines.
  1345. X   Error messages and status info during the generation process are
  1346. X   written to stdout, or sometimes to stderr. */
  1347. X
  1348. X#include "pgenheaders.h"
  1349. X#include "grammar.h"
  1350. X#include "node.h"
  1351. X#include "parsetok.h"
  1352. X#include "pgen.h"
  1353. X
  1354. Xint debugging;
  1355. X
  1356. X/* Forward */
  1357. Xgrammar *getgrammar PROTO((char *filename));
  1358. X#ifdef THINK_C
  1359. Xint main PROTO((int, char **));
  1360. Xchar *askfile PROTO((void));
  1361. X#endif
  1362. X
  1363. Xint
  1364. Xmain(argc, argv)
  1365. X    int argc;
  1366. X    char **argv;
  1367. X{
  1368. X    grammar *g;
  1369. X    node *n;
  1370. X    FILE *fp;
  1371. X    char *filename;
  1372. X    
  1373. X#ifdef THINK_C
  1374. X    filename = askfile();
  1375. X#else
  1376. X    if (argc != 2) {
  1377. X        fprintf(stderr, "usage: %s grammar\n", argv[0]);
  1378. X        exit(2);
  1379. X    }
  1380. X    filename = argv[1];
  1381. X#endif
  1382. X    g = getgrammar(filename);
  1383. X    fp = fopen("graminit.c", "w");
  1384. X    if (fp == NULL) {
  1385. X        perror("graminit.c");
  1386. X        exit(1);
  1387. X    }
  1388. X    printf("Writing graminit.c ...\n");
  1389. X    printgrammar(g, fp);
  1390. X    fclose(fp);
  1391. X    fp = fopen("graminit.h", "w");
  1392. X    if (fp == NULL) {
  1393. X        perror("graminit.h");
  1394. X        exit(1);
  1395. X    }
  1396. X    printf("Writing graminit.h ...\n");
  1397. X    printnonterminals(g, fp);
  1398. X    fclose(fp);
  1399. X    exit(0);
  1400. X}
  1401. X
  1402. Xgrammar *
  1403. Xgetgrammar(filename)
  1404. X    char *filename;
  1405. X{
  1406. X    FILE *fp;
  1407. X    node *n;
  1408. X    grammar *g0, *g;
  1409. X    
  1410. X    fp = fopen(filename, "r");
  1411. X    if (fp == NULL) {
  1412. X        perror(filename);
  1413. X        exit(1);
  1414. X    }
  1415. X    g0 = meta_grammar();
  1416. X    n = NULL;
  1417. X    parsefile(fp, filename, g0, g0->g_start, (char *)NULL, (char *)NULL, &n);
  1418. X    fclose(fp);
  1419. X    if (n == NULL) {
  1420. X        fprintf(stderr, "Parsing error.\n");
  1421. X        exit(1);
  1422. X    }
  1423. X    g = pgen(n);
  1424. X    if (g == NULL) {
  1425. X        printf("Bad grammar.\n");
  1426. X        exit(1);
  1427. X    }
  1428. X    return g;
  1429. X}
  1430. X
  1431. X#ifdef THINK_C
  1432. Xchar *
  1433. Xaskfile()
  1434. X{
  1435. X    char buf[256];
  1436. X    static char name[256];
  1437. X    printf("Input file name: ");
  1438. X    if (fgets(buf, sizeof buf, stdin) == NULL) {
  1439. X        printf("EOF\n");
  1440. X        exit(1);
  1441. X    }
  1442. X    /* XXX The (unsigned char *) case is needed by THINK C 3.0 */
  1443. X    if (sscanf(/*(unsigned char *)*/buf, " %s ", name) != 1) {
  1444. X        printf("No file\n");
  1445. X        exit(1);
  1446. X    }
  1447. X    return name;
  1448. X}
  1449. X#endif
  1450. X
  1451. Xvoid
  1452. Xfatal(msg)
  1453. X    char *msg;
  1454. X{
  1455. X    fprintf(stderr, "pgen: FATAL ERROR: %s\n", msg);
  1456. X    exit(1);
  1457. X}
  1458. X
  1459. X/* XXX TO DO:
  1460. X   - check for duplicate definitions of names (instead of fatal err)
  1461. X*/
  1462. EOF
  1463. fi
  1464. if test -s 'src/printgrammar.c'
  1465. then echo '*** I will not over-write existing file src/printgrammar.c'
  1466. else
  1467. echo 'x - src/printgrammar.c'
  1468. sed 's/^X//' > 'src/printgrammar.c' << 'EOF'
  1469. X/***********************************************************
  1470. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1471. XNetherlands.
  1472. X
  1473. X                        All Rights Reserved
  1474. X
  1475. XPermission to use, copy, modify, and distribute this software and its 
  1476. Xdocumentation for any purpose and without fee is hereby granted, 
  1477. Xprovided that the above copyright notice appear in all copies and that
  1478. Xboth that copyright notice and this permission notice appear in 
  1479. Xsupporting documentation, and that the names of Stichting Mathematisch
  1480. XCentrum or CWI not be used in advertising or publicity pertaining to
  1481. Xdistribution of the software without specific, written prior permission.
  1482. X
  1483. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1484. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1485. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1486. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1487. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1488. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1489. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1490. X
  1491. X******************************************************************/
  1492. X
  1493. X/* Print a bunch of C initializers that represent a grammar */
  1494. X
  1495. X#include "pgenheaders.h"
  1496. X#include "grammar.h"
  1497. X
  1498. X/* Forward */
  1499. Xstatic void printarcs PROTO((int, dfa *, FILE *));
  1500. Xstatic void printstates PROTO((grammar *, FILE *));
  1501. Xstatic void printdfas PROTO((grammar *, FILE *));
  1502. Xstatic void printlabels PROTO((grammar *, FILE *));
  1503. X
  1504. Xvoid
  1505. Xprintgrammar(g, fp)
  1506. X    grammar *g;
  1507. X    FILE *fp;
  1508. X{
  1509. X    fprintf(fp, "#include \"pgenheaders.h\"\n");
  1510. X    fprintf(fp, "#include \"grammar.h\"\n");
  1511. X    printdfas(g, fp);
  1512. X    printlabels(g, fp);
  1513. X    fprintf(fp, "grammar gram = {\n");
  1514. X    fprintf(fp, "\t%d,\n", g->g_ndfas);
  1515. X    fprintf(fp, "\tdfas,\n");
  1516. X    fprintf(fp, "\t{%d, labels},\n", g->g_ll.ll_nlabels);
  1517. X    fprintf(fp, "\t%d\n", g->g_start);
  1518. X    fprintf(fp, "};\n");
  1519. X}
  1520. X
  1521. Xvoid
  1522. Xprintnonterminals(g, fp)
  1523. X    grammar *g;
  1524. X    FILE *fp;
  1525. X{
  1526. X    dfa *d;
  1527. X    int i;
  1528. X    
  1529. X    d = g->g_dfa;
  1530. X    for (i = g->g_ndfas; --i >= 0; d++)
  1531. X        fprintf(fp, "#define %s %d\n", d->d_name, d->d_type);
  1532. X}
  1533. X
  1534. Xstatic void
  1535. Xprintarcs(i, d, fp)
  1536. X    int i;
  1537. X    dfa *d;
  1538. X    FILE *fp;
  1539. X{
  1540. X    arc *a;
  1541. X    state *s;
  1542. X    int j, k;
  1543. X    
  1544. X    s = d->d_state;
  1545. X    for (j = 0; j < d->d_nstates; j++, s++) {
  1546. X        fprintf(fp, "static arc arcs_%d_%d[%d] = {\n",
  1547. X            i, j, s->s_narcs);
  1548. X        a = s->s_arc;
  1549. X        for (k = 0; k < s->s_narcs; k++, a++)
  1550. X            fprintf(fp, "\t{%d, %d},\n", a->a_lbl, a->a_arrow);
  1551. X        fprintf(fp, "};\n");
  1552. X    }
  1553. X}
  1554. X
  1555. Xstatic void
  1556. Xprintstates(g, fp)
  1557. X    grammar *g;
  1558. X    FILE *fp;
  1559. X{
  1560. X    state *s;
  1561. X    dfa *d;
  1562. X    int i, j;
  1563. X    
  1564. X    d = g->g_dfa;
  1565. X    for (i = 0; i < g->g_ndfas; i++, d++) {
  1566. X        printarcs(i, d, fp);
  1567. X        fprintf(fp, "static state states_%d[%d] = {\n",
  1568. X            i, d->d_nstates);
  1569. X        s = d->d_state;
  1570. X        for (j = 0; j < d->d_nstates; j++, s++)
  1571. X            fprintf(fp, "\t{%d, arcs_%d_%d},\n",
  1572. X                s->s_narcs, i, j);
  1573. X        fprintf(fp, "};\n");
  1574. X    }
  1575. X}
  1576. X
  1577. Xstatic void
  1578. Xprintdfas(g, fp)
  1579. X    grammar *g;
  1580. X    FILE *fp;
  1581. X{
  1582. X    dfa *d;
  1583. X    int i, j;
  1584. X    
  1585. X    printstates(g, fp);
  1586. X    fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas);
  1587. X    d = g->g_dfa;
  1588. X    for (i = 0; i < g->g_ndfas; i++, d++) {
  1589. X        fprintf(fp, "\t{%d, \"%s\", %d, %d, states_%d,\n",
  1590. X            d->d_type, d->d_name, d->d_initial, d->d_nstates, i);
  1591. X        fprintf(fp, "\t \"");
  1592. X        for (j = 0; j < NBYTES(g->g_ll.ll_nlabels); j++)
  1593. X            fprintf(fp, "\\%03o", d->d_first[j] & 0xff);
  1594. X        fprintf(fp, "\"},\n");
  1595. X    }
  1596. X    fprintf(fp, "};\n");
  1597. X}
  1598. X
  1599. Xstatic void
  1600. Xprintlabels(g, fp)
  1601. X    grammar *g;
  1602. X    FILE *fp;
  1603. X{
  1604. X    label *l;
  1605. X    int i;
  1606. X    
  1607. X    fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels);
  1608. X    l = g->g_ll.ll_label;
  1609. X    for (i = g->g_ll.ll_nlabels; --i >= 0; l++) {
  1610. X        if (l->lb_str == NULL)
  1611. X            fprintf(fp, "\t{%d, 0},\n", l->lb_type);
  1612. X        else
  1613. X            fprintf(fp, "\t{%d, \"%s\"},\n",
  1614. X                l->lb_type, l->lb_str);
  1615. X    }
  1616. X    fprintf(fp, "};\n");
  1617. X}
  1618. EOF
  1619. fi
  1620. if test -s 'src/regsub.c'
  1621. then echo '*** I will not over-write existing file src/regsub.c'
  1622. else
  1623. echo 'x - src/regsub.c'
  1624. sed 's/^X//' > 'src/regsub.c' << 'EOF'
  1625. X/***********************************************************
  1626. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1627. XNetherlands.
  1628. X
  1629. X                        All Rights Reserved
  1630. X
  1631. XPermission to use, copy, modify, and distribute this software and its 
  1632. Xdocumentation for any purpose and without fee is hereby granted, 
  1633. Xprovided that the above copyright notice appear in all copies and that
  1634. Xboth that copyright notice and this permission notice appear in 
  1635. Xsupporting documentation, and that the names of Stichting Mathematisch
  1636. XCentrum or CWI not be used in advertising or publicity pertaining to
  1637. Xdistribution of the software without specific, written prior permission.
  1638. X
  1639. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1640. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1641. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1642. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1643. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1644. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1645. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1646. X
  1647. X******************************************************************/
  1648. X
  1649. X/*
  1650. X * regsub
  1651. X *
  1652. X *    Copyright (c) 1986 by University of Toronto.
  1653. X *    Written by Henry Spencer.  Not derived from licensed software.
  1654. X#ifdef MULTILINE
  1655. X *    Changed by Guido van Rossum, CWI, Amsterdam
  1656. X *    for multi-line support.
  1657. X#endif
  1658. X *
  1659. X *    Permission is granted to anyone to use this software for any
  1660. X *    purpose on any computer system, and to redistribute it freely,
  1661. X *    subject to the following restrictions:
  1662. X *
  1663. X *    1. The author is not responsible for the consequences of use of
  1664. X *        this software, no matter how awful, even if they arise
  1665. X *        from defects in it.
  1666. X *
  1667. X *    2. The origin of this software must not be misrepresented, either
  1668. X *        by explicit claim or by omission.
  1669. X *
  1670. X *    3. Altered versions must be plainly marked as such, and must not
  1671. X *        be misrepresented as being the original software.
  1672. X */
  1673. X#include <stdio.h>
  1674. X#include "regexp.h"
  1675. X#include "regmagic.h"
  1676. X
  1677. X#ifndef CHARBITS
  1678. X#define    UCHARAT(p)    ((int)*(unsigned char *)(p))
  1679. X#else
  1680. X#define    UCHARAT(p)    ((int)*(p)&CHARBITS)
  1681. X#endif
  1682. X
  1683. X/*
  1684. X - regsub - perform substitutions after a regexp match
  1685. X */
  1686. Xvoid
  1687. Xregsub(prog, source, dest)
  1688. Xregexp *prog;
  1689. Xchar *source;
  1690. Xchar *dest;
  1691. X{
  1692. X    register char *src;
  1693. X    register char *dst;
  1694. X    register char c;
  1695. X    register int no;
  1696. X    register int len;
  1697. X    extern char *strncpy();
  1698. X
  1699. X    if (prog == NULL || source == NULL || dest == NULL) {
  1700. X        regerror("NULL parm to regsub");
  1701. X        return;
  1702. X    }
  1703. X    if (UCHARAT(prog->program) != MAGIC) {
  1704. X        regerror("damaged regexp fed to regsub");
  1705. X        return;
  1706. X    }
  1707. X
  1708. X    src = source;
  1709. X    dst = dest;
  1710. X    while ((c = *src++) != '\0') {
  1711. X        if (c == '&')
  1712. X            no = 0;
  1713. X        else if (c == '\\' && '0' <= *src && *src <= '9')
  1714. X            no = *src++ - '0';
  1715. X        else
  1716. X            no = -1;
  1717. X
  1718. X        if (no < 0) {    /* Ordinary character. */
  1719. X            if (c == '\\' && (*src == '\\' || *src == '&'))
  1720. X                c = *src++;
  1721. X#ifdef MULTILINE
  1722. X            else if (c == '\\' && *src == 'n') {
  1723. X                c = '\n';
  1724. X                src++;
  1725. X            }
  1726. X#endif
  1727. X            *dst++ = c;
  1728. X        } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
  1729. X            len = prog->endp[no] - prog->startp[no];
  1730. X            (void) strncpy(dst, prog->startp[no], len);
  1731. X            dst += len;
  1732. X            if (len != 0 && *(dst-1) == '\0') {    /* strncpy hit NUL. */
  1733. X                regerror("damaged match string");
  1734. X                return;
  1735. X            }
  1736. X        }
  1737. X    }
  1738. X    *dst++ = '\0';
  1739. X}
  1740. EOF
  1741. fi
  1742. if test -s 'src/sc_errors.c'
  1743. then echo '*** I will not over-write existing file src/sc_errors.c'
  1744. else
  1745. echo 'x - src/sc_errors.c'
  1746. sed 's/^X//' > 'src/sc_errors.c' << 'EOF'
  1747. X/***********************************************************
  1748. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1749. XNetherlands.
  1750. X
  1751. X                        All Rights Reserved
  1752. X
  1753. XPermission to use, copy, modify, and distribute this software and its 
  1754. Xdocumentation for any purpose and without fee is hereby granted, 
  1755. Xprovided that the above copyright notice appear in all copies and that
  1756. Xboth that copyright notice and this permission notice appear in 
  1757. Xsupporting documentation, and that the names of Stichting Mathematisch
  1758. XCentrum or CWI not be used in advertising or publicity pertaining to
  1759. Xdistribution of the software without specific, written prior permission.
  1760. X
  1761. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1762. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1763. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1764. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1765. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1766. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1767. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1768. X
  1769. X******************************************************************/
  1770. X
  1771. X
  1772. X#include <stdio.h>
  1773. X
  1774. X#include "PROTO.h"
  1775. X#include "object.h"
  1776. X#include "errors.h"
  1777. X#include "sc_errors.h"
  1778. X#include "stringobject.h"
  1779. X#include "tupleobject.h"
  1780. X
  1781. Xobject *
  1782. Xerr_scerr(sc_errno)
  1783. X    int sc_errno;
  1784. X{
  1785. X    switch(sc_errno) {
  1786. X    
  1787. X    case NoBufSize:
  1788. X        err_setstr(StubcodeError, "Stubcode didn't start with BufSize");
  1789. X        break;
  1790. X    
  1791. X    case TwoBufSize:
  1792. X        err_setstr(StubcodeError, "Stubcode can't have more then one BufSize");
  1793. X        break;
  1794. X
  1795. X    case ElementIsNull:
  1796. X        err_setstr(StubcodeError, "Trying to access an NIL object");
  1797. X        break;
  1798. X    
  1799. X    case StackOverflow:
  1800. X        err_setstr(StubcodeError, "Stack overflow");
  1801. X        return NULL;
  1802. X    
  1803. X    case StackUnderflow:
  1804. X        err_setstr(StubcodeError, "Stack underflow");
  1805. X        return NULL;
  1806. X    
  1807. X    case NoEndLoop:
  1808. X        err_setstr(StubcodeError, "LoopXXX with no EndLoop");
  1809. X        return NULL;
  1810. X    
  1811. X    case BufferOverflow:
  1812. X        err_setstr(StubcodeError, "Buffer overflow");
  1813. X        return NULL;
  1814. X    
  1815. X    }
  1816. X    return NULL;
  1817. X}
  1818. X
  1819. Xerr_scerrset(sc_errno, value, instr)
  1820. X    int sc_errno;
  1821. X    object *value;
  1822. X    char *instr;
  1823. X{
  1824. X    object *str, *str1, *t;
  1825. X
  1826. X    if ((t = newtupleobject(3)) == NULL) {
  1827. X        return -1;
  1828. X    }
  1829. X    if ((str = newstringobject(instr)) == NULL) {
  1830. X        return -1;
  1831. X    }
  1832. X    if (settupleitem(t, 2, str) != 0) {
  1833. X        return -1;
  1834. X    }
  1835. X    INCREF(value);
  1836. X    if (settupleitem(t, 1, value) != 0) {
  1837. X        DECREF(t);
  1838. X        return -1;
  1839. X    }
  1840. X    switch(sc_errno) {
  1841. X    
  1842. X    case TypeFailure:
  1843. X        if ((str1 = newstringobject("Unexpected type")) == NULL) {
  1844. X            DECREF(t);
  1845. X            return -1;
  1846. X        }
  1847. X        break;
  1848. X    
  1849. X    case RangeError:
  1850. X        if ((str1 = newstringobject("Value out of range")) == NULL) {
  1851. X            DECREF(t);
  1852. X            return -1;
  1853. X        }
  1854. X        break;
  1855. X    
  1856. X    case SizeError:
  1857. X        if ((str1 = newstringobject("Value doesn't have the right size")) == NULL) {
  1858. X            DECREF(t);
  1859. X            return -1;
  1860. X        }
  1861. X        break;
  1862. X    
  1863. X    case FlagError:
  1864. X        if ((str1 = newstringobject("Illegal flag value")) == NULL) {
  1865. X            DECREF(t);
  1866. X            return -1;
  1867. X        }
  1868. X        break;
  1869. X
  1870. X    case TransError:
  1871. X        if ((str1 = newstringobject("hdr.h_status != 0")) == NULL) {
  1872. X            DECREF(t);
  1873. X            return -1;
  1874. X        }
  1875. X        break;
  1876. X
  1877. X    default:
  1878. X        if ((str1 = newstringobject("sc_errno not found")) == NULL) {
  1879. X            DECREF(t);
  1880. X            return -1;
  1881. X        }
  1882. X        break;
  1883. X    }
  1884. X    if (settupleitem(t, 0, str1) != 0) {
  1885. X        DECREF(t);
  1886. X        return -1;
  1887. X    }
  1888. X    err_setval(StubcodeError, t);
  1889. X    DECREF(t);
  1890. X    return -1;
  1891. X}
  1892. EOF
  1893. fi
  1894. if test -s 'src/sc_global.h'
  1895. then echo '*** I will not over-write existing file src/sc_global.h'
  1896. else
  1897. echo 'x - src/sc_global.h'
  1898. sed 's/^X//' > 'src/sc_global.h' << 'EOF'
  1899. X/***********************************************************
  1900. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1901. XNetherlands.
  1902. X
  1903. X                        All Rights Reserved
  1904. X
  1905. XPermission to use, copy, modify, and distribute this software and its 
  1906. Xdocumentation for any purpose and without fee is hereby granted, 
  1907. Xprovided that the above copyright notice appear in all copies and that
  1908. Xboth that copyright notice and this permission notice appear in 
  1909. Xsupporting documentation, and that the names of Stichting Mathematisch
  1910. XCentrum or CWI not be used in advertising or publicity pertaining to
  1911. Xdistribution of the software without specific, written prior permission.
  1912. X
  1913. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1914. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1915. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1916. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1917. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1918. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1919. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1920. X
  1921. X******************************************************************/
  1922. X
  1923. X
  1924. X/*
  1925. X**    This file contains the data used in Ail, Python and sc2txt.
  1926. X**
  1927. X**    If you want to add an instuction to the instructions just define
  1928. X**    it here and add the instruction in the function sc_interpreter in
  1929. X**    the file sc_interpreter.c in the switch. You also have to make a
  1930. X**    new function with the name x{instruction_name} in the file
  1931. X**    sc_interpreter.
  1932. X*/
  1933. X
  1934. X/*
  1935. X**    When you want to change the types of the opcode or the operand
  1936. X**    you maybe need to adjust the options to mypf. And the defines :
  1937. X**    SwapOpcode, SwapOperand.
  1938. X*/
  1939. X
  1940. Xtypedef unsigned char TscOpcode;
  1941. Xtypedef long TscOperand;
  1942. X
  1943. X#define SC_MAGIC    0x19901991
  1944. X
  1945. X#define SwapOpcode(x)    x = x
  1946. X#define SwapOperand(l)    ((l))=(((((l))>>24)&0xFF)|((((l))>>8)&0xFF00)|((((l))<<8)&0xFF0000)|((((l))<<24)&0xFF000000))
  1947. X
  1948. X#define STKSIZE        256
  1949. X
  1950. X#define OPERAND        0x80
  1951. X#define FLAGS        0x40
  1952. X
  1953. X/*
  1954. X**    The headerfields. The value of the flag is the index of the fields 
  1955. X**    array from the file mhdr.c plus one
  1956. X*/
  1957. X
  1958. X#define H_EXTRA        0x00000001
  1959. X#define H_SIZE        0x00000002
  1960. X#define H_OFFSET    0x00000003
  1961. X#define H_PORT        0x00000004
  1962. X#define H_PRIV        0x00000005
  1963. X#define PSEUDOFIELD    0x00000006
  1964. X#define ALL_FIELDS    0x000000ff
  1965. X
  1966. X/*
  1967. X**    The specefiers for the integers
  1968. X*/
  1969. X
  1970. X#define NOSIGN        0x00000100
  1971. X#define INT32        0x00000200
  1972. X#define ALLTYPES    0xffffff00
  1973. X
  1974. X/*
  1975. X**    The opcode with no operand    
  1976. X*/
  1977. X
  1978. X#define ListS        0x00
  1979. X#define PutVS        0x01
  1980. X#define GetVS        0x02
  1981. X#define StringS        0x03
  1982. X#define    Equal        0x04
  1983. X#define NoArgs        0x05
  1984. X
  1985. X/*
  1986. X *    Between 0x10 and 0x3f there is space for predefined marshal
  1987. X *    and unmarshal functions or macros that do not have an operand
  1988. X */
  1989. X
  1990. X#define MarshTC        0x10
  1991. X#define UnMarshTC    0x11
  1992. X
  1993. X/*
  1994. X**    The opcode with a number as operand
  1995. X*/
  1996. X
  1997. X#define BufSize        0x80
  1998. X#define Trans        0x81
  1999. X#define TTupleS        0x82
  2000. X#define Unpack        0x83
  2001. X#define PutFS        0x84
  2002. X#define TStringSeq    0x85
  2003. X#define TStringSlt    0x86
  2004. X#define TListSeq    0x87
  2005. X#define TListSlt    0x88
  2006. X#define LoopPut        0x89
  2007. X#define EndLoop        0x8a
  2008. X#define Dup        0x8b
  2009. X#define Pop        0x8c
  2010. X#define Align        0x8d
  2011. X#define Pack        0x8e
  2012. X#define LoopGet        0x8f
  2013. X#define GetFS        0x90
  2014. X#define PushI        0x91
  2015. X
  2016. X/*
  2017. X**      Between 0xa0 and 0xbf there is space for predefined marshal
  2018. X**      and unmarshal functions or macros with a numberas operand
  2019. X*/
  2020. X
  2021. X
  2022. X/*
  2023. X**    The opcodes with flags as operand
  2024. X*/
  2025. X
  2026. X#define AilWord        0xc0
  2027. X#define PutI        0xc1
  2028. X#define PutC        0xc2
  2029. X#define GetI        0xc3
  2030. X#define GetC        0xc4
  2031. X
  2032. X/*
  2033. X**    Between 0xe0 and 0xff there is space for predefined marshal
  2034. X**    and unmarshal functions or macros with flags as operand
  2035. X*/
  2036. EOF
  2037. fi
  2038. if test -s 'src/scdbg.c'
  2039. then echo '*** I will not over-write existing file src/scdbg.c'
  2040. else
  2041. echo 'x - src/scdbg.c'
  2042. sed 's/^X//' > 'src/scdbg.c' << 'EOF'
  2043. X/***********************************************************
  2044. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  2045. XNetherlands.
  2046. X
  2047. X                        All Rights Reserved
  2048. X
  2049. XPermission to use, copy, modify, and distribute this software and its 
  2050. Xdocumentation for any purpose and without fee is hereby granted, 
  2051. Xprovided that the above copyright notice appear in all copies and that
  2052. Xboth that copyright notice and this permission notice appear in 
  2053. Xsupporting documentation, and that the names of Stichting Mathematisch
  2054. XCentrum or CWI not be used in advertising or publicity pertaining to
  2055. Xdistribution of the software without specific, written prior permission.
  2056. X
  2057. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  2058. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  2059. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  2060. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  2061. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  2062. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  2063. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  2064. X
  2065. X******************************************************************/
  2066. X
  2067. X
  2068. X#include "sc_global.h"
  2069. X
  2070. Xvoid xPrintNum(Num)
  2071. XTscOperand Num;
  2072. X{
  2073. X
  2074. X    printf(" %ld",(long)Num);
  2075. X}
  2076. X
  2077. Xvoid xPrintFlags(Flags)
  2078. XTscOperand Flags;
  2079. X{
  2080. Xlong x;
  2081. X
  2082. X    x = (long)Flags;
  2083. X    x = x & 0x0000000F;
  2084. X    if (x == H_EXTRA) printf(" h_extra");
  2085. X    if (x == H_SIZE) printf(" h_size");
  2086. X    if (x == H_OFFSET) printf(" h_offset");
  2087. X    if (x == H_PORT) printf(" h_port");
  2088. X    if (x == H_PRIV) printf(" h_priv");
  2089. X    if (x == PSEUDOFIELD) printf(" h_port and h_priv");
  2090. X    x = (long)Flags;
  2091. X    if (x & NOSIGN) printf(" unsigned");
  2092. X    if (x & INT32) printf(" int32");
  2093. X}
  2094. X
  2095. Xvoid xPrintCode(Opcode)
  2096. XTscOpcode Opcode;
  2097. X{
  2098. X
  2099. X    switch (Opcode) {
  2100. X    
  2101. X    case BufSize:    printf("BufSize");
  2102. X                break;
  2103. X
  2104. X    case Trans:        printf("Trans");
  2105. X                break;
  2106. X
  2107. X    case TTupleS:    printf("TTupleS");
  2108. X                break;
  2109. X
  2110. X    case Unpack:    printf("Unpack");
  2111. X                break;
  2112. X
  2113. X    case AilWord:    printf("AilWord");
  2114. X                break;
  2115. X
  2116. X    case ListS:        printf("ListS");
  2117. X                break;
  2118. X
  2119. X    case StringS:    printf("StringS");
  2120. X                break;
  2121. X
  2122. X    case PutFS:        printf("PutFS");
  2123. X                break;
  2124. X
  2125. X    case TStringSeq:    printf("TStringSeq");
  2126. X                break;
  2127. X
  2128. X    case TStringSlt:    printf("TStringSlt");
  2129. X                break;
  2130. X
  2131. X    case PutVS:        printf("PutVS");
  2132. X                break;
  2133. X
  2134. X    case TListSeq:    printf("TListSeq");
  2135. X                break;
  2136. X
  2137. X    case TListSlt:    printf("TListSlt");
  2138. X                break;
  2139. X
  2140. X    case LoopPut:    printf("LoopPut");
  2141. X                break;
  2142. X
  2143. X    case EndLoop:    printf("EndLoop");
  2144. X                break;
  2145. X
  2146. X    case PutI:        printf("PutI");
  2147. X                break;
  2148. X
  2149. X    case PutC:        printf("PutC");
  2150. X                break;
  2151. X
  2152. X    case Dup:        printf("Dup");
  2153. X                break;
  2154. X
  2155. X    case Pop:        printf("Pop");
  2156. X                break;
  2157. X
  2158. X    case Align:        printf("Align");
  2159. X                break;
  2160. X    
  2161. X    case Pack:        printf("Pack");
  2162. X                break;
  2163. X
  2164. X    case GetVS:        printf("GetVS");
  2165. X                break;
  2166. X    
  2167. X    case LoopGet:    printf("LoopGet");
  2168. X                break;
  2169. X    
  2170. X    case GetFS:        printf("GetFS");
  2171. X                break;
  2172. X    
  2173. X    case GetI:        printf("GetI");
  2174. X                break;
  2175. X    
  2176. X    case GetC:        printf("GetC");
  2177. X                break;
  2178. X    
  2179. X    case PushI:        printf("PushI");
  2180. X                break;
  2181. X    
  2182. X    case MarshTC:    printf("MarshTC");
  2183. X                break;
  2184. X    
  2185. X    case UnMarshTC:    printf("UnMarshTC");
  2186. X                break;
  2187. X
  2188. X    case Equal:        printf("Equal");
  2189. X                break;
  2190. X
  2191. X    default:        printf("Unknown opcode %04x",(int)Opcode);
  2192. X                break;
  2193. X    }
  2194. X}
  2195. EOF
  2196. fi
  2197. if test -s 'src/structmember.c'
  2198. then echo '*** I will not over-write existing file src/structmember.c'
  2199. else
  2200. echo 'x - src/structmember.c'
  2201. sed 's/^X//' > 'src/structmember.c' << 'EOF'
  2202. X/***********************************************************
  2203. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  2204. XNetherlands.
  2205. X
  2206. X                        All Rights Reserved
  2207. X
  2208. XPermission to use, copy, modify, and distribute this software and its 
  2209. Xdocumentation for any purpose and without fee is hereby granted, 
  2210. Xprovided that the above copyright notice appear in all copies and that
  2211. Xboth that copyright notice and this permission notice appear in 
  2212. Xsupporting documentation, and that the names of Stichting Mathematisch
  2213. XCentrum or CWI not be used in advertising or publicity pertaining to
  2214. Xdistribution of the software without specific, written prior permission.
  2215. X
  2216. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  2217. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  2218. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  2219. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  2220. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  2221. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  2222. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  2223. X
  2224. X******************************************************************/
  2225. X
  2226. X/* Map C struct members to Python object attributes */
  2227. X
  2228. X#include "allobjects.h"
  2229. X
  2230. X#include "structmember.h"
  2231. X
  2232. Xobject *
  2233. Xgetmember(addr, mlist, name)
  2234. X    char *addr;
  2235. X    struct memberlist *mlist;
  2236. X    char *name;
  2237. X{
  2238. X    struct memberlist *l;
  2239. X    
  2240. X    for (l = mlist; l->name != NULL; l++) {
  2241. X        if (strcmp(l->name, name) == 0) {
  2242. X            object *v;
  2243. X            addr += l->offset;
  2244. X            switch (l->type) {
  2245. X            case T_SHORT:
  2246. X                v = newintobject((long) *(short*)addr);
  2247. X                break;
  2248. X            case T_INT:
  2249. X                v = newintobject((long) *(int*)addr);
  2250. X                break;
  2251. X            case T_LONG:
  2252. X                v = newintobject(*(long*)addr);
  2253. X                break;
  2254. X            case T_FLOAT:
  2255. X                v = newfloatobject((double)*(float*)addr);
  2256. X                break;
  2257. X            case T_DOUBLE:
  2258. X                v = newfloatobject(*(double*)addr);
  2259. X                break;
  2260. X            case T_STRING:
  2261. X                if (*(char**)addr == NULL) {
  2262. X                    INCREF(None);
  2263. X                    v = None;
  2264. X                }
  2265. X                else
  2266. X                    v = newstringobject(*(char**)addr);
  2267. X                break;
  2268. X            case T_OBJECT:
  2269. X                v = *(object **)addr;
  2270. X                if (v == NULL)
  2271. X                    v = None;
  2272. X                INCREF(v);
  2273. X                break;
  2274. X            default:
  2275. X                err_setstr(SystemError, "bad memberlist type");
  2276. X                v = NULL;
  2277. X            }
  2278. X            return v;
  2279. X        }
  2280. X    }
  2281. X    
  2282. X    err_setstr(NameError, name);
  2283. X    return NULL;
  2284. X}
  2285. X
  2286. Xint
  2287. Xsetmember(addr, mlist, name, v)
  2288. X    char *addr;
  2289. X    struct memberlist *mlist;
  2290. X    char *name;
  2291. X    object *v;
  2292. X{
  2293. X    struct memberlist *l;
  2294. X    
  2295. X    for (l = mlist; l->name != NULL; l++) {
  2296. X        if (strcmp(l->name, name) == 0) {
  2297. X            if (l->readonly || l->type == T_STRING) {
  2298. X                err_setstr(RuntimeError, "readonly attribute");
  2299. X                return -1;
  2300. X            }
  2301. X            addr += l->offset;
  2302. X            switch (l->type) {
  2303. X            case T_SHORT:
  2304. X                if (!is_intobject(v)) {
  2305. X                    err_badarg();
  2306. X                    return -1;
  2307. X                }
  2308. X                *(short*)addr = getintvalue(v);
  2309. X                break;
  2310. X            case T_INT:
  2311. X                if (!is_intobject(v)) {
  2312. X                    err_badarg();
  2313. X                    return -1;
  2314. X                }
  2315. X                *(int*)addr = getintvalue(v);
  2316. X                break;
  2317. X            case T_LONG:
  2318. X                if (!is_intobject(v)) {
  2319. X                    err_badarg();
  2320. X                    return -1;
  2321. X                }
  2322. X                *(long*)addr = getintvalue(v);
  2323. X                break;
  2324. X            case T_FLOAT:
  2325. X                if (is_intobject(v))
  2326. X                    *(float*)addr = getintvalue(v);
  2327. X                else if (is_floatobject(v))
  2328. X                    *(float*)addr = getfloatvalue(v);
  2329. X                else {
  2330. X                    err_badarg();
  2331. X                    return -1;
  2332. X                }
  2333. X                break;
  2334. X            case T_DOUBLE:
  2335. X                if (is_intobject(v))
  2336. X                    *(double*)addr = getintvalue(v);
  2337. X                else if (is_floatobject(v))
  2338. X                    *(double*)addr = getfloatvalue(v);
  2339. X                else {
  2340. X                    err_badarg();
  2341. X                    return -1;
  2342. X                }
  2343. X                break;
  2344. X            case T_OBJECT:
  2345. X                XDECREF(*(object **)addr);
  2346. X                XINCREF(v);
  2347. X                *(object **)addr = v;
  2348. X                break;
  2349. X            default:
  2350. X                err_setstr(SystemError, "bad memberlist type");
  2351. X                return -1;
  2352. X            }
  2353. X            return 0;
  2354. X        }
  2355. X    }
  2356. X    
  2357. X    err_setstr(NameError, name);
  2358. X    return -1;
  2359. X}
  2360. EOF
  2361. fi
  2362. if test -s 'src/xxobject.c'
  2363. then echo '*** I will not over-write existing file src/xxobject.c'
  2364. else
  2365. echo 'x - src/xxobject.c'
  2366. sed 's/^X//' > 'src/xxobject.c' << 'EOF'
  2367. X/***********************************************************
  2368. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  2369. XNetherlands.
  2370. X
  2371. X                        All Rights Reserved
  2372. X
  2373. XPermission to use, copy, modify, and distribute this software and its 
  2374. Xdocumentation for any purpose and without fee is hereby granted, 
  2375. Xprovided that the above copyright notice appear in all copies and that
  2376. Xboth that copyright notice and this permission notice appear in 
  2377. Xsupporting documentation, and that the names of Stichting Mathematisch
  2378. XCentrum or CWI not be used in advertising or publicity pertaining to
  2379. Xdistribution of the software without specific, written prior permission.
  2380. X
  2381. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  2382. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  2383. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  2384. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  2385. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  2386. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  2387. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  2388. X
  2389. X******************************************************************/
  2390. X
  2391. X/* Use this file as a template to start implementing a new object type.
  2392. X   If your objects will be called foobar, start by copying this file to
  2393. X   foobarobject.c, changing all occurrences of xx to foobar and all
  2394. X   occurrences of Xx by Foobar.  You will probably want to delete all
  2395. X   references to 'x_attr' and add your own types of attributes
  2396. X   instead.  Maybe you want to name your local variables other than
  2397. X   'xp'.  If your object type is needed in other files, you'll have to
  2398. X   create a file "foobarobject.h"; see intobject.h for an example. */
  2399. X
  2400. X
  2401. X/* Xx objects */
  2402. X
  2403. X#include "allobjects.h"
  2404. X
  2405. Xtypedef struct {
  2406. X    OB_HEAD
  2407. X    object    *x_attr;    /* Attributes dictionary */
  2408. X} xxobject;
  2409. X
  2410. Xextern typeobject Xxtype;    /* Really static, forward */
  2411. X
  2412. X#define is_xxobject(v)        ((v)->ob_type == &Xxtype)
  2413. X
  2414. Xstatic xxobject *
  2415. Xnewxxobject(arg)
  2416. X    object *arg;
  2417. X{
  2418. X    xxobject *xp;
  2419. X    xp = NEWOBJ(xxobject, &Xxtype);
  2420. X    if (xp == NULL)
  2421. X        return NULL;
  2422. X    xp->x_attr = NULL;
  2423. X    return xp;
  2424. X}
  2425. X
  2426. X/* Xx methods */
  2427. X
  2428. Xstatic void
  2429. Xxx_dealloc(xp)
  2430. X    xxobject *xp;
  2431. X{
  2432. X    XDECREF(xp->x_attr);
  2433. X    DEL(xp);
  2434. X}
  2435. X
  2436. Xstatic object *
  2437. Xxx_demo(self, args)
  2438. X    xxobject *self;
  2439. X    object *args;
  2440. X{
  2441. X    if (!getnoarg(args))
  2442. X        return NULL;
  2443. X    INCREF(None);
  2444. X    return None;
  2445. X}
  2446. X
  2447. Xstatic struct methodlist xx_methods[] = {
  2448. X    "demo",        xx_demo,
  2449. X    {NULL,        NULL}        /* sentinel */
  2450. X};
  2451. X
  2452. Xstatic object *
  2453. Xxx_getattr(xp, name)
  2454. X    xxobject *xp;
  2455. X    char *name;
  2456. X{
  2457. X    if (xp->x_attr != NULL) {
  2458. X        object *v = dictlookup(xp->x_attr, name);
  2459. X        if (v != NULL) {
  2460. X            INCREF(v);
  2461. X            return v;
  2462. X        }
  2463. X    }
  2464. X    return findmethod(xx_methods, (object *)xp, name);
  2465. X}
  2466. X
  2467. Xstatic int
  2468. Xxx_setattr(xp, name, v)
  2469. X    xxobject *xp;
  2470. X    char *name;
  2471. X    object *v;
  2472. X{
  2473. X    if (xp->x_attr == NULL) {
  2474. X        xp->x_attr = newdictobject();
  2475. X        if (xp->x_attr == NULL)
  2476. X            return -1;
  2477. X    }
  2478. X    if (v == NULL)
  2479. X        return dictremove(xp->x_attr, name);
  2480. X    else
  2481. X        return dictinsert(xp->x_attr, name, v);
  2482. X}
  2483. X
  2484. Xstatic typeobject Xxtype = {
  2485. X    OB_HEAD_INIT(&Typetype)
  2486. X    0,            /*ob_size*/
  2487. X    "xx",            /*tp_name*/
  2488. X    sizeof(xxobject),    /*tp_size*/
  2489. X    0,            /*tp_itemsize*/
  2490. X    /* methods */
  2491. X    xx_dealloc,    /*tp_dealloc*/
  2492. X    0,        /*tp_print*/
  2493. X    xx_getattr,    /*tp_getattr*/
  2494. X    xx_setattr,    /*tp_setattr*/
  2495. X    0,        /*tp_compare*/
  2496. X    0,        /*tp_repr*/
  2497. X};
  2498. EOF
  2499. fi
  2500. echo 'Part 16 out of 21 of pack.out complete.'
  2501. exit 0
  2502.