home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM68K / SNOBOL4.LBR / QUEST.CQ / QUEST.C
Text File  |  2000-06-30  |  4KB  |  161 lines

  1. /* -*-c,save-*- */
  2. /*
  3.  * quest.c - QUEST function
  4.  * Robert Heller. Created: Wed Mar 5, 1986 19:35:17.95
  5.  * Last Mod: 
  6.  * 
  7.  * (c) Copyright 1986 by Robert Heller
  8.  *     All Rights Reserved
  9.  * 
  10.  * 
  11.  */
  12.  
  13. #include <stdio.h>
  14.  
  15. #include "patdef.h"
  16.  
  17. #define LOCAL static
  18.  
  19. /* #define DEBUG /* debuging */
  20.  
  21. #ifdef DEBUG
  22. #define LOCAL /* static */
  23. #endif
  24.  
  25. LOCAL PATTERN_NODE *NEUT,*QUEST_QPA,*ID_V;
  26. LOCAL PATTERN_NODE *BRA_QP1,*BRA_QN,*BRA_QVP_QL,*LO_HI,*BRASL;
  27. ARG_DESCR *acons();
  28. LOCAL STRING_DESCR QPA,V,QP1,QN,QVP,QL,QLOW,QHI;
  29. char *malloc();
  30. #include "phrase.h"
  31.  
  32. que_init()
  33. {
  34.     ph_init();
  35.     NEUT = breakk_c("|()");
  36.     QUEST_QPA = concat(NEUT,
  37.                concat(c_lit_string("("),
  38.                   concat(cassign(NEUT,acons(STRING,&QPA)),
  39.                      concat(c_lit_string(")"),
  40.                         alt(NEUT,REM)))));
  41.     ID_V = cassign(alt(span_c("0123456789"),NIL),acons(STRING,&V));
  42.     BRA_QP1 = concat(cassign(breakk_c("|"),acons(STRING,&QP1)),
  43.              c_lit_string("|"));
  44.     BRA_QN =  concat(cassign(breakk_c("("),acons(STRING,&QN)),
  45.              c_lit_string("("));
  46.     BRA_QVP_QL = concat(cassign(breakk_c(")"),acons(STRING,&QVP)),
  47.             concat(c_lit_string(")"),
  48.                    cassign(REM,acons(STRING,&QL))));
  49.     LO_HI = concat(cassign(breakk_c("."),acons(STRING,&QLOW)),
  50.            concat(c_lit_string("..."),
  51.               cassign(REM,acons(STRING,&QHI))));
  52.     BRASL = breakk_c("/");
  53.     }
  54. quest(qs,argv)
  55. register char *qs;
  56. long int argv;
  57. {
  58.     static STRING_DESCR matched;
  59.     register char *qp;
  60.     static char qmess[132],qi[132],qp1[132],fool[256];
  61.     register int len,stat;
  62.  
  63.     if (pmatch(qs,BRASL,&matched) != MATCH_SUCCESS) return(-1);
  64.     len = matched.length;
  65.     if (len > 131) len = 131;
  66.     strncpy(qmess,matched.base+matched.offset,len);
  67.     qmess[len] = '\0';
  68.     qp = matched.base+matched.offset+matched.length+1;
  69.     for (;;) {
  70.     printf("\n%s? ",qmess);
  71.     gets(qi);
  72.     stat = questp(qi,qp,&argv);
  73.     if (stat >= 0) return(stat);
  74.     strcpy(qp1,qp);
  75.     while (pmatch(qp1,QUEST_QPA,&matched) == MATCH_SUCCESS) {
  76.         strncpy(matched.base+matched.offset,QPA.base+QPA.offset,
  77.             QPA.length);
  78.         strcpy(matched.base+matched.offset+QPA.length,
  79.            matched.base+matched.offset+matched.length);
  80.         }
  81.     if (strcmp(qi,"?") != 0) {
  82.         rsentence("Bad input, you <STUPID> <FOOL>.",fool);
  83.         printf("%s\n",fool);
  84.         }
  85.     printf("The correct form is %s\n",qp1);
  86.     }
  87.     }
  88. LOCAL questp(qs,qp,argv)
  89. register char *qs,*qp;
  90. register long int *argv;
  91. {
  92.     STRING_DESCR matched;
  93.     char qp1[132],qvp[132];
  94.     register int len,stat,qnn,qln;
  95.     register int qsn,qlown,qhin;
  96.     register int *qnp;
  97.  
  98.     while (pmatch(qp,BRA_QP1,&matched) == MATCH_SUCCESS) {
  99.     len = QP1.length;
  100.     if (len > 131) len = 131;
  101.     strncpy(qp1,QP1.base+QP1.offset,len);
  102.     qp1[len] = '\0';
  103.     qp = matched.base+matched.offset+matched.length;
  104.     stat = questp(qs,qp1,argv);
  105.     if (stat >= 0) return(stat);
  106.     }
  107.     if (pmatch(qp,BRA_QN,&matched) != MATCH_SUCCESS) return(-1);
  108.     qp = matched.base+matched.offset+matched.length;
  109.     if (QN.length == 0) qnn = -1;
  110.     else qnn = atoi(QN.base+QN.offset);
  111.     pmatch(qp,BRA_QVP_QL,&matched);
  112.     strncpy(qvp,QVP.base+QVP.offset,QVP.length);
  113.     qvp[QVP.length] = '\0';
  114.     if (QL.length > 0) qln = atoi(QL.base+QL.offset);
  115.     else qln = 0;
  116.     if (strcmp(qvp,"ARB") == 0) {
  117.     if (qnn != -1) strcpy(argv[qnn],qs);
  118.     return(qln);
  119.     }
  120.     else if (pmatch(qvp,LO_HI,&matched) == MATCH_SUCCES) {
  121.     if (!isnumber(qs,strlen(qs))) return(-1);
  122.     qsn = atoi(qs);
  123.     if (!isnumber(QLOW.base+QLOW.offset,QLOW.length)) return(-1);
  124. #ifdef DEBUG
  125. printf("***In questp(): &qvp[0] = %08X, QLOW(base = %08X, offset = %d, length = %d\n",
  126.        qvp,QLOW.base,QLOW.offset,QLOW.length);
  127. #endif
  128.     qlown = atoi(QLOW.base+QLOW.offset);
  129.     if (!isnumber(QHI.base+QHI.offset,QHI.length)) return(-1);
  130.     qhin = atoi(QHI.base+QHI.offset);
  131. #ifdef DEBUG
  132.     printf("***In questp(): qvp=%s,qsn=%d,qlown=%d,qhin=%d\n",qvp,qsn,
  133.         qlown,qhin);
  134. #endif
  135.     if (qlown > qsn) return(-1);
  136.     if (qsn > qhin) return(-1);
  137.     if (qnn != -1) {
  138.         qnp = (short int *) argv[qnn];
  139.         *qnp = qsn;
  140.         }
  141.     return(qln);
  142.     }
  143.     else if (strcmp(qs,qvp) == 0) {
  144.     if (qnn != -1) strcpy(argv[qnn],qs);
  145.     return(qln);
  146.     }
  147.     else return(-1);
  148.     }
  149. LOCAL isnumber(s,l)
  150. register char *s;
  151. register int l;
  152. {
  153.     char *index();
  154.  
  155.     while (l-- > 0) {
  156.     if (index("0123456789",*s) == 0L) return(0);
  157.     s++;
  158.     }
  159.     return(1);
  160.     }
  161.