home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / pretty.zoo / pretty
Text File  |  1990-02-21  |  21KB  |  792 lines

  1. echo x - pspp/Makefile
  2. sed 's/^X//' >pspp/Makefile <<'*-*-END-of-pspp/Makefile-*-*'
  3. XCFLAGS         = -g
  4. X
  5. XLEX = lex -v
  6. X
  7. XDEST          = .
  8. X
  9. XEXTHDRS          =
  10. X
  11. XHDRS          =
  12. X
  13. XLDFLAGS          =
  14. X
  15. XLIBS          =  -ll
  16. X
  17. XLINKER          = cc
  18. X
  19. XMAKEFILE      = Makefile
  20. X
  21. XOBJS          = pspp.o
  22. X
  23. XPRINT          = pr
  24. X
  25. XPROGRAM          = pspp
  26. X
  27. XSRCS          = pspp.l
  28. X
  29. Xall:        $(PROGRAM)
  30. X
  31. X${PROGRAM}.shar: $(SRCS) ${MAKEFILE} README test patchlevel.h
  32. X    shar -a $(SRCS) ${MAKEFILE} README test  patchlevel.h> ${PROGRAM}.shar
  33. X
  34. X$(PROGRAM):     $(OBJS)
  35. X        @echo -n "Loading $(PROGRAM) ... "
  36. X        @$(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
  37. X        @echo "done"
  38. X
  39. Xclean:;        @rm -f $(OBJS)
  40. X
  41. Xdepend:;    @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST)
  42. X
  43. Xindex:;        @ctags -wx $(HDRS) $(SRCS)
  44. X
  45. Xinstall:    $(PROGRAM)
  46. X        @echo Installing $(PROGRAM) in $(DEST)
  47. X        @install -s $(PROGRAM) $(DEST)
  48. X
  49. Xprint:;        @$(PRINT) $(HDRS) $(SRCS)
  50. X
  51. Xprogram:        $(PROGRAM)
  52. X
  53. Xtags:           $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
  54. X
  55. Xupdate:        $(DEST)/$(PROGRAM)
  56. X
  57. X###
  58. *-*-END-of-pspp/Makefile-*-*
  59. echo x - pspp/README
  60. sed 's/^X//' >pspp/README <<'*-*-END-of-pspp/README-*-*'
  61. X
  62. X                    Copyright (c) 1989, Josh Siegel
  63. X
  64. XYou may copy the pspp kit in whole or in part as long as you don't try to
  65. Xmake money off it, or pretend that you wrote it.
  66. X
  67. X            --Josh Siegel
  68. X            siegel@hc.dspo.gov
  69. X
  70. XControlable things:
  71. X        1) Backslashing inner strings (\(\))           bs
  72. X        2) rearrange function definitions              ra  (not implemented)
  73. X            Turn:
  74. X              /foo { % bar
  75. X            Into:
  76. X              /foo % bar
  77. X              {
  78. X        3) newline before 
  79. X            "def"                        db
  80. X            "begin"                      bb
  81. X            "classbegin"                 cbb
  82. X            "dictbegin"                  dbb
  83. X            "end"                        eb
  84. X            "classend"                   ceb
  85. X            "dictend"                    deb
  86. X            "grestore"                   grb
  87. X            "gsave"                      gsb
  88. X            "if"                         ib
  89. X            "{"                          lcb
  90. X            "}"                          rcb
  91. X            "["                          lbb
  92. X            "]"                          rbb
  93. X        4) newline after  
  94. X            "def"                         da
  95. X            "begin"                      ba
  96. X            "classbegin"                 cba
  97. X            "dictbegin"                  dba
  98. X            "end"                        ea
  99. X            "classend"                   cea
  100. X            "dictend"                    dea
  101. X            "grestore"                   gra
  102. X            "gsave"                      gsa
  103. X            "if"                         ia
  104. X            "["                          lba
  105. X            "]"                          rba
  106. X            "{"                          lca
  107. X            "}"                          rca
  108. X
  109. XDefault flags:
  110. X    ba bb bs cba cbb cea ceb da dba dbb dea deb ea eb lca rcb pn ia gi
  111. X
  112. XWays to change flags:
  113. X
  114. X    Put a command line into your PostScript code...
  115. X
  116. X    example:
  117. X        <beginning of line>%%= -bs +cea -dba
  118. X
  119. X    Put a command line into a .pspp in your home directory
  120. X
  121. X    example:
  122. X        -lba -rba -lca
  123. X
  124. X    Set options when you call program...
  125. X
  126. X    example:
  127. X        pspp -rca
  128. X
  129. XTo run:
  130. X
  131. X% pspp [options files] < file.in > file.out
  132. X
  133. XOr, run it from vi...
  134. X
  135. X:%!pspp
  136. X
  137. XOr,
  138. X
  139. X% pspp -lba foo.cps +lba foobar.ps
  140. X
  141. XSpecial NeWS related features...
  142. X
  143. X    lines beginning with cdef are assumed to be cdef calls under NeWS.
  144. X    This causes the rest of the file (till the next cdef) to be indented one.
  145. X
  146. X    Lines beginning with "#" or "%" are passed through unmodified.
  147. X
  148. XNote to hackers:
  149. X    You may notice how I stuck lots of the keywords together into
  150. X    a single lex rule... I am not going to explain this... there is
  151. X    a reason for this... don't worry about it for now.  The reason
  152. X    doesn't show up in this version.
  153. X
  154. *-*-END-of-pspp/README-*-*
  155. echo x - pspp/patchlevel.h
  156. sed 's/^X//' >pspp/patchlevel.h <<'*-*-END-of-pspp/patchlevel.h-*-*'
  157. X#define PATCHLEVEL 3
  158. *-*-END-of-pspp/patchlevel.h-*-*
  159. echo x - pspp/pspp.l
  160. sed 's/^X//' >pspp/pspp.l <<'*-*-END-of-pspp/pspp.l-*-*'
  161. X
  162. X%{
  163. X
  164. X/*
  165. X
  166. X                    Copyright (c) 1989, Josh Siegel
  167. X
  168. XYou may copy the pspp kit in whole or in part as long as you don't try to
  169. Xmake money off it, or pretend that you wrote it.
  170. X
  171. X Version 0.04
  172. X    Fixed a fix in 0.03
  173. X    Made it callable on files and sets of files.
  174. X
  175. X Version 0.03
  176. X    Fixed run away white space problem...
  177. X    Fixed (()) matching
  178. X    Fixed it turning (\(\)) into (\\(\\))
  179. X
  180. X Version 0.02
  181. X    Added bracstack as well as fixing problems associated with class.ps
  182. X
  183. X Version 0.01
  184. X    initial release
  185. X*/
  186. X
  187. X#define FLAG_BA        0x1
  188. X#define FLAG_BB        0x2
  189. X#define FLAG_BS        0x4
  190. X#define FLAG_CBA    0x8
  191. X#define FLAG_CBB    0x10
  192. X#define FLAG_CEA    0x20
  193. X#define FLAG_CEB    0x40
  194. X#define FLAG_DA        0x80
  195. X#define FLAG_DB        0x100
  196. X#define FLAG_DBA    0x200
  197. X#define FLAG_DBB    0x400
  198. X#define FLAG_DEA    0x800
  199. X#define FLAG_DEB    0x1000
  200. X#define FLAG_EA        0x2000
  201. X#define FLAG_EB        0x4000
  202. X#define FLAG_LCA    0x8000
  203. X#define FLAG_LCB    0x10000
  204. X#define FLAG_RCA    0x20000
  205. X#define FLAG_RCB    0x40000
  206. X#define FLAG_PN        0x80000
  207. X#define FLAG_IB        0x100000
  208. X#define FLAG_IA        0x200000
  209. X#define FLAG_LBB    0x400000
  210. X#define FLAG_LBA    0x800000
  211. X#define FLAG_RBB    0x1000000
  212. X#define FLAG_RBA    0x2000000
  213. X#define FLAG_GSB    0x4000000
  214. X#define FLAG_GSA    0x8000000
  215. X#define FLAG_GRB    0x10000000
  216. X#define FLAG_GRA    0x20000000
  217. X#define FLAG_GI        0x40000000
  218. X#define FLAG_RA     0x80000000
  219. X
  220. X#define DEFAULT_FLAG (FLAG_BA|FLAG_BB|FLAG_BS|FLAG_CBA|FLAG_CBB|\
  221. X        FLAG_CEA|FLAG_CEB|FLAG_DA|FLAG_DBA|FLAG_DBB|FLAG_DEA|\
  222. X        FLAG_DEB|FLAG_EA|FLAG_EB|FLAG_LCA|FLAG_RCB| \
  223. X        FLAG_PN | FLAG_IA | FLAG_GI)
  224. X
  225. X#define check_flag(x) ((x) & flags)
  226. X
  227. X#define STACK_LEVELS 32
  228. X
  229. Xint neednew,i,level,braclevel,flags,minlevel;
  230. Xint minstack[STACK_LEVELS],flagstack[STACK_LEVELS],minstackpnt,flagstackpnt;
  231. Xint bracstack[STACK_LEVELS],bracpnt;
  232. X%}
  233. XW    [ \t]+    
  234. X%%
  235. X\(        {
  236. X            int pcount;
  237. X
  238. X            pcount=1;
  239. X            i = 1;
  240. X
  241. X            while(pcount) {
  242. X                yytext[i]=input();
  243. X                switch(yytext[i]) {
  244. X                    case '\\':
  245. X                        i++;
  246. X                        yytext[i]=input();
  247. X                        break;
  248. X                    case '(': 
  249. X                        pcount++; 
  250. X                        if(check_flag(FLAG_BS)) {
  251. X                            yytext[i++]='\\';
  252. X                            yytext[i]='(';
  253. X                        }
  254. X                        break;
  255. X                    case ')': 
  256. X                        pcount--; 
  257. X                        if(pcount) {
  258. X                            if(check_flag(FLAG_BS)) {
  259. X                                yytext[i++]='\\';
  260. X                                yytext[i]=')';
  261. X                            }
  262. X                        }
  263. X                        break;
  264. X                    case '\n':
  265. X                        yytext[i++]='\\';
  266. X                        yytext[i]='n';
  267. X                        break;
  268. X                    default: break;
  269. X                }
  270. X                i++;
  271. X            }
  272. X            yytext[i]= '\0';
  273. X            newline();
  274. X            fprintf(yyout,"%s",yytext);
  275. X        }
  276. X
  277. X\{[ \t]*\}    { /* Yet another special case */ newline(); fprintf(yyout,yytext); }
  278. X
  279. X"def"    {
  280. X                if(check_flag(FLAG_DB))  
  281. X                    neednew=1;
  282. X                newline(); 
  283. X                fprintf(yyout,"%s",yytext);
  284. X                if(check_flag(FLAG_DA)) 
  285. X                    neednew=1;
  286. X        }
  287. X
  288. X"{"    {
  289. X        if(check_flag(FLAG_LCB))
  290. X            neednew=1;
  291. X        newline();
  292. X        level++;
  293. X        pushbraclevel();
  294. X        fprintf(yyout,"%s",yytext);
  295. X        if(check_flag(FLAG_LCA))
  296. X            neednew=1;
  297. X    }
  298. X
  299. X"}"    {
  300. X    if(check_flag(FLAG_RCB))
  301. X        neednew=1;
  302. X    level--;
  303. X    popbraclevel();
  304. X    newline();
  305. X    fprintf(yyout,"%s",yytext);
  306. X    if(check_flag(FLAG_RCA))
  307. X        neednew=1;
  308. X    }
  309. X
  310. X"begin"|"dictbegin"|"classbegin"|"["|"gsave"    {
  311. X                switch(yytext[0]) {
  312. X                case 'd':
  313. X                    if(check_flag(FLAG_DBB))
  314. X                        neednew=1;
  315. X                    break;
  316. X                case 'b':
  317. X                    if(check_flag(FLAG_BB))
  318. X                        neednew=1;
  319. X                    break;
  320. X                case 'c':
  321. X                    if(check_flag(FLAG_CBB))
  322. X                        neednew=1;
  323. X                    break;
  324. X                case 'g':
  325. X                    if(check_flag(FLAG_GSB))
  326. X                        neednew=1;
  327. X                    break;
  328. X                case '[':
  329. X                    if(check_flag(FLAG_LBB))
  330. X                        neednew=1;
  331. X                    break;
  332. X                }
  333. X                newline();
  334. X            
  335. X                fprintf(yyout,"%s",yytext);
  336. X                braclevel++;
  337. X                switch(yytext[0]) {
  338. X                case 'd':
  339. X                    if(check_flag(FLAG_DBA))
  340. X                        neednew=1;
  341. X                    break;
  342. X                case 'b':
  343. X                    if(check_flag(FLAG_BA))
  344. X                        neednew=1;
  345. X                    break;
  346. X                case 'c':
  347. X                    if(check_flag(FLAG_CBA))
  348. X                        neednew=1;
  349. X                    break;
  350. X                case 'g':
  351. X                    if(check_flag(FLAG_GSA)) 
  352. X                        neednew=1;
  353. X                    if(!check_flag(FLAG_GI))
  354. X                        braclevel--;
  355. X                    break;
  356. X                case '[':
  357. X                    if(check_flag(FLAG_LBA))
  358. X                        neednew=1;
  359. X                    break;
  360. X                }
  361. X            }
  362. X
  363. X
  364. X"end"|"dictend"|"classend"|"]"|"grestore"     {
  365. X                braclevel--;
  366. X                switch(yytext[0]) {
  367. X                case 'd':
  368. X                    if(check_flag(FLAG_DEB))
  369. X                        neednew=1;
  370. X                    break;
  371. X                case 'e':
  372. X                    if(check_flag(FLAG_EB))
  373. X                        neednew=1;
  374. X                    break;
  375. X                case 'c':
  376. X                    if(check_flag(FLAG_CEB))
  377. X                        neednew=1;
  378. X                    break;
  379. X                case 'g':
  380. X                    if(check_flag(FLAG_GRB))
  381. X                        neednew=1;
  382. X                    if(!check_flag(FLAG_GI))
  383. X                        braclevel++;
  384. X                    break;
  385. X                case ']':
  386. X                    if(check_flag(FLAG_RBB)) 
  387. X                        neednew=1;
  388. X                    break;
  389. X                }
  390. X
  391. X                newline();
  392. X                fprintf(yyout,"%s",yytext);
  393. X                switch(yytext[0]) {
  394. X                case 'd':
  395. X                    if(check_flag(FLAG_DEA))
  396. X                        neednew=1;
  397. X                    break;
  398. X                case 'e':
  399. X                    if(check_flag(FLAG_EA))
  400. X                        neednew=1;
  401. X                    break;
  402. X                case 'c':
  403. X                    if(check_flag(FLAG_CEA))
  404. X                        neednew=1;
  405. X                    break;
  406. X                case 'g':
  407. X                    if(check_flag(FLAG_GRA))
  408. X                        neednew=1;
  409. X                    break;
  410. X                case ']':
  411. X                    if(check_flag(FLAG_RBA))
  412. X                        neednew=1;
  413. X                    break;
  414. X                }
  415. X            }
  416. X
  417. X(if|ifelse)            {
  418. X
  419. X                if(check_flag(FLAG_IB)) 
  420. X                    neednew=1;
  421. X                newline(); 
  422. X                fprintf(yyout,"%s",yytext);
  423. X                if(check_flag(FLAG_IA))  
  424. X                    neednew=1;
  425. X                }
  426. X^cdef    {
  427. X            level=0;
  428. X            minlevel=0;
  429. X            newline();
  430. X            fprintf(yyout,"%s",yytext);
  431. X            level=1; /* Indent one so it looks ncie */
  432. X            braclevel=0; /* Reset the bracket level */
  433. X            bracpnt=0;  /* Reset the stack */
  434. X            minlevel=1;
  435. X        }
  436. X^\%\%=.*\n    {
  437. X                if(neednew) 
  438. X                    fprintf(yyout,"\n");
  439. X                yytext[yyleng-1]='\0';
  440. X                fprintf(yyout,"%s",yytext);
  441. X                parseflag(&yytext[3]);
  442. X                neednew=1;
  443. X            }
  444. X^#.*\n    |
  445. X^\%.*\n    {
  446. X            if(neednew) 
  447. X                fprintf(yyout,"\n");
  448. X            yytext[yyleng-1]='\0';
  449. X            fprintf(yyout,"%s",yytext);
  450. X            neednew=1;
  451. X        }
  452. X^[ \t]+\%.*\n {    
  453. X                char *p;
  454. X
  455. X                newline();
  456. X                yytext[yyleng-1]='\0';
  457. X                p = yytext;
  458. X                while(*p!='%') p++;
  459. X                fprintf(yyout,"%s",p);
  460. X                neednew=1;
  461. X                }
  462. X\%.*\n    {
  463. X            yytext[yyleng-1]='\0';
  464. X            fprintf(yyout,"%s",yytext);
  465. X            neednew=1;
  466. X        }
  467. X^{W}       neednew=1;
  468. X{W}       fprintf(yyout," ");
  469. X^[ \t]*\n    { if(check_flag(FLAG_PN)) fprintf(yyout,"\n");}
  470. X\n        neednew=1;
  471. X[^ \t\n\[\]\{\}\(]+ |
  472. X.        {newline();
  473. X            fprintf(yyout,"%s",yytext);
  474. X            ; /* Almost everything falls to this */ }
  475. X%%
  476. X
  477. X
  478. X
  479. Xmain(argc, argv)
  480. X    int             argc;
  481. X    char           *argv[];
  482. X{
  483. X
  484. X    FILE           *fp, *fopen(), *fpo;
  485. X    char            buff[255];
  486. X    int do_stdio;
  487. X
  488. X    do_stdio = 1;
  489. X    minstackpnt = 0;
  490. X    flagstackpnt = 0;
  491. X    bracpnt = 0;
  492. X    neednew = 0;
  493. X    level = 0;
  494. X    braclevel = 0;
  495. X    minlevel = 0;
  496. X    flags = DEFAULT_FLAG;
  497. X
  498. X    sprintf(buff, "%s/.pspp", getenv("HOME"));
  499. X
  500. X    fp = fopen(buff, "r");
  501. X
  502. X    if(fp!=NULL) {
  503. X        while(fgets(buff,255,fp)!=NULL)
  504. X            parseflag(buff);
  505. X        fclose(fp);
  506. X    }
  507. X
  508. X    while (--argc) {
  509. X        if( argv[argc][0]=='-' || argv[argc][0]=='+' )
  510. X            parseflag(argv[argc]);
  511. X        else
  512. X            {
  513. X            do_stdio = 0;
  514. X
  515. X            sprintf(buff,"%s.BAK",argv[argc]);
  516. X            unlink(buff);
  517. X            if(rename(argv[argc],buff)!=0) {
  518. X                perror("rename");
  519. X                exit(0);
  520. X            }
  521. X            fpo = fopen(argv[argc],"w");
  522. X            fp = fopen(buff,"r");
  523. X            yyin = fp;
  524. X            yyout = fpo;
  525. X            yylex();
  526. X            fprintf(fpo,"\n");
  527. X            fclose(fp);
  528. X            fclose(fpo);
  529. X        }
  530. X    }
  531. X
  532. X    if(do_stdio) {
  533. X        yylex();
  534. X        fprintf(yyout,"\n");
  535. X    }
  536. X    exit(0);
  537. X}
  538. Xnewline()
  539. X{
  540. X    int             cnt;
  541. X
  542. X    if (!neednew)
  543. X        return;
  544. X
  545. X    fprintf(yyout,"\n");
  546. X
  547. X    if (level < minlevel)        /* Save ourselves from errors in the 
  548. X                                postscript */
  549. X        level = minlevel;
  550. X
  551. X    if(bracpnt>0) {
  552. X        if(braclevel < bracstack[bracpnt-1]) 
  553. X                braclevel = bracstack[bracpnt-1];
  554. X    }  else {
  555. X        if(braclevel<0)
  556. X            braclevel = 0;
  557. X    }
  558. X
  559. X    cnt = level + braclevel;
  560. X
  561. X    while (cnt--)
  562. X        fprintf(yyout,"    ");
  563. X
  564. X    neednew = 0;
  565. X}
  566. Xparseflag(str)
  567. X    char           *str;
  568. X{
  569. X    char           *p;
  570. X    int             effect, the_flag;
  571. X
  572. X
  573. X    p = str;
  574. X
  575. X
  576. X    while (*p) {
  577. X        while (*p == ' ' || *p == '\t')
  578. X            p++;
  579. X
  580. X        effect = 1;    /* Set flag (default) */
  581. X        the_flag = 0;
  582. X
  583. X        switch (*p) {
  584. X        case '+':
  585. X            p++;
  586. X            break;
  587. X        case '-':
  588. X            effect = 0;
  589. X            p++;
  590. X            break;
  591. X        default:
  592. X            break;
  593. X        }
  594. X
  595. X        /*
  596. X         * I make no defense of the code below... later I will make a
  597. X         * proper hash table (yes.. yes.. I know there are lots of
  598. X         * incorrect sets )
  599. X         */
  600. X
  601. X        if(effect<2)
  602. X        switch (p[0]) {
  603. X        case 'b':
  604. X            switch (p[1]) {
  605. X            case 'a':
  606. X                the_flag = FLAG_BA;
  607. X                break;
  608. X            case 'b':
  609. X                the_flag = FLAG_BB;
  610. X                break;
  611. X            case 's':
  612. X                the_flag = FLAG_BS;
  613. X                break;
  614. X            default:
  615. X                break;
  616. X            }
  617. X            break;
  618. X        case 'c':
  619. X            if (p[1] == 'b')
  620. X                if (p[2] == 'a')
  621. X                    the_flag = FLAG_CBA;
  622. X                else
  623. X                    the_flag = FLAG_CBB;
  624. X            else if (p[2] == 'a')
  625. X                the_flag = FLAG_CEA;
  626. X            else
  627. X                the_flag = FLAG_CEB;
  628. X            break;
  629. X        case 'd':
  630. X            switch (p[1]) {
  631. X            case 'a':
  632. X                the_flag = FLAG_DA;
  633. X                break;
  634. X            case 'b':
  635. X                switch (p[2]) {
  636. X                case 'a':
  637. X                    the_flag = FLAG_DBA;
  638. X                    break;
  639. X                case 'b':
  640. X                    the_flag = FLAG_DBB;
  641. X                    break;
  642. X                default:
  643. X                    the_flag = FLAG_DB;
  644. X                    break;
  645. X                }
  646. X                break;
  647. X            case 'e':
  648. X                if (p[2] == 'a')
  649. X                    the_flag = FLAG_DEA;
  650. X                else
  651. X                    the_flag = FLAG_DEB;
  652. X                break;
  653. X            default:
  654. X                break;
  655. X            }
  656. X            break;
  657. X        case 'i':
  658. X            if (p[1] == 'a')
  659. X                the_flag = FLAG_IA;
  660. X            else
  661. X                the_flag = FLAG_IB;
  662. X            break;
  663. X        case 'e':
  664. X            if (p[1] == 'a')
  665. X                the_flag = FLAG_EA;
  666. X            else
  667. X                the_flag = FLAG_EB;
  668. X            break;
  669. X        case 'l':
  670. X            if (p[1] == 'c')
  671. X                if (p[2] == 'a')
  672. X                    the_flag = FLAG_LCA;
  673. X                else
  674. X                    the_flag = FLAG_LCB;
  675. X            else
  676. X                if (p[2] == 'a')
  677. X                    the_flag = FLAG_LBA;
  678. X                else
  679. X                    the_flag = FLAG_LBB;
  680. X            break;
  681. X        case 'g':
  682. X            switch(p[1]) {
  683. X                case 'i':
  684. X                    the_flag = FLAG_GI;
  685. X                    break;
  686. X                case 's':
  687. X                    if(p[2]=='b')
  688. X                        the_flag = FLAG_GSB;
  689. X                    else
  690. X                        the_flag = FLAG_GSA;
  691. X                    break;
  692. X                case 'r':
  693. X                    if(p[2]=='b')
  694. X                        the_flag = FLAG_GRB;
  695. X                    else
  696. X                        the_flag = FLAG_GRA;
  697. X                    break;
  698. X            }
  699. X            break;
  700. X        case 'r':
  701. X            switch(p[1]) {
  702. X                case 'c':
  703. X                    if (p[2] == 'a')
  704. X                        the_flag = FLAG_RCA;
  705. X                    else
  706. X                        the_flag = FLAG_RCB;
  707. X                    break;
  708. X                case 'b':
  709. X                    if (p[2] == 'a')
  710. X                        the_flag = FLAG_RBA;
  711. X                    else 
  712. X                        the_flag = FLAG_RBB;
  713. X                    break;
  714. X                case 'a':
  715. X                    the_flag = FLAG_RA;
  716. X                    break;
  717. X                default: 
  718. X                    break;
  719. X            }
  720. X            break;
  721. X        case 'p':
  722. X            the_flag = FLAG_PN;
  723. X            break;
  724. X        default:
  725. X            break;
  726. X        }
  727. X
  728. X        if (the_flag) {
  729. X            if (effect)
  730. X                flags |= the_flag;
  731. X            else
  732. X                flags &= ~the_flag;
  733. X        }
  734. X        p++;
  735. X
  736. X        while (*p >= 'a' && *p <= 'z')
  737. X            p++;
  738. X    }
  739. X}
  740. Xpushflag()
  741. X{
  742. X    flagstack[flagstackpnt]=flags;
  743. X
  744. X    if(flagstackpnt<STACK_LEVELS) 
  745. X        flagstackpnt++;
  746. X}
  747. Xpopflag()
  748. X{
  749. X    if(flagstackpnt>0) 
  750. X        flagstackpnt--;
  751. X    else
  752. X        return;
  753. X
  754. X    flags=flagstack[flagstackpnt];
  755. X}
  756. Xpushmin()
  757. X{
  758. X    minstack[minstackpnt]=minlevel;
  759. X
  760. X    if(minstackpnt<STACK_LEVELS) 
  761. X        minstackpnt++;
  762. X}
  763. Xpopmin()
  764. X{
  765. X    if(minstackpnt>0) 
  766. X        minstackpnt--;
  767. X    else
  768. X        return;
  769. X
  770. X    minlevel=minstack[minstackpnt];
  771. X}
  772. Xpushbraclevel()
  773. X{
  774. X    bracstack[bracpnt]=braclevel;
  775. X
  776. X    if(bracpnt<STACK_LEVELS) 
  777. X        bracpnt++;
  778. X}
  779. Xpopbraclevel()
  780. X{
  781. X    if(bracpnt>0) 
  782. X        bracpnt--;
  783. X    else
  784. X        return;
  785. X
  786. X    braclevel=bracstack[bracpnt];
  787. X}
  788. *-*-END-of-pspp/pspp.l-*-*
  789. exit
  790.  
  791.  
  792.