home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / enquire.zip / ENQUIRE.C < prev    next >
C/C++ Source or Header  |  1991-01-10  |  3KB  |  165 lines

  1. /*
  2.  Calling sequence is:
  3.  
  4.     code [-%d] rules-file
  5.  
  6. This should generate some amusing National Enquirer headlines. The rules
  7. file may be altered to generate poems, company names, film titles etc.
  8.  
  9. ===============================================================================
  10. */
  11.  
  12. #include <stdio.h>
  13.  
  14. extern long time();
  15. extern short ran_vec[];
  16.  
  17. struct gstruct {
  18.          int items;
  19.          char *item[128];
  20.          char data;
  21.        } *group[64];
  22.  
  23. int groups;
  24. char line[2048];
  25. int startdata[10000];
  26. FILE *f1;
  27.  
  28. rnd(i)
  29.   int i;
  30. {
  31.   return((rand()&0xffff) % i);
  32. }
  33.  
  34. search(word)
  35.   char word[];
  36. {
  37.   int i;
  38.   for(i=0;i<groups;++i)
  39.   if(comps(word,group[i]->item[0]))return(i);
  40.   return(-1);
  41. }
  42.  
  43. comps(word1,word2)
  44.   char word1[],word2[];
  45. {
  46.   int i;
  47.   for(i=0;(word1[i]==word2[i]&&word1[i]!=0&&word2[i]!=0);++i);
  48.   if(word1[i]!=word2[i])return(0);
  49.   return(1);
  50. }
  51.  
  52. alpha(a)
  53.   char a;
  54. {
  55.   if((a>='a'&&a<='z')||(a>='A'&&a<='Z')||(a>='0'&&a<='9')||(a=='_'))return(1);
  56.   return(0);
  57. }
  58.  
  59. init(filename)
  60.   char filename[];
  61. {
  62.   int i;
  63.   char *pnt;
  64.   f1=fopen(filename,"r");
  65.   if(f1==NULL){printf("Bad open: %s\n",filename);exit();}
  66.   groups=0;
  67.   group[groups] = (struct gstruct *)(&startdata[0]);
  68.   group[groups]->items=0;
  69.   group[groups]->item[0]= &(group[groups]->data);
  70.   for(;;)
  71.     {
  72.       getline(f1,line);
  73.       if(line[0]=='%')
  74.         {
  75.           group[groups+1]=(struct gstruct *)((int)(group[groups]->item[group[groups]->items]+1) & -2);
  76.           ++groups;
  77.           group[groups]->items=0;
  78.           group[groups]->item[0]= &(group[groups]->data);
  79.           getline(f1,line);
  80.           if(line[0]=='%')return(1);
  81.         }
  82.       pnt=group[groups]->item[group[groups]->items];
  83.       for(i=0;(*(pnt++)=line[i++])!=0;);
  84.       group[groups]->items += 1;
  85.       group[groups]->item[group[groups]->items] = pnt;
  86.     }
  87. }
  88.  
  89. exec(word)
  90.   char word[];
  91. {
  92.   char *ppnt;
  93.   char word1[64];
  94.   int g;
  95.   g=search(word);
  96.   if(g == -1)
  97.     {
  98.       printf("%s",word);
  99.       return(1);
  100.     }
  101.   ppnt=group[g]->item[1+rnd(group[g]->items - 1)];
  102.   for(;;)
  103.     {
  104.       getword(&ppnt,word1);
  105.       if(word1[0]==0)return(1);
  106.       exec(word1);
  107.     }
  108. }
  109.  
  110. getword(ppnt,word)
  111.   char word[];
  112.   char **ppnt;
  113. {
  114.   int i;
  115.   word[0]=0;
  116.   while((!alpha(**ppnt))&&(**ppnt!=0))
  117.     {
  118.       if(**ppnt == '\\')printf("\n");
  119.       else if(**ppnt != '|')printf("%c",**ppnt);
  120.       (*ppnt)++;
  121.     }
  122.   if(**ppnt==0)return(1);
  123.   for(i=0;alpha(**ppnt);(*ppnt)++)word[i++]= **ppnt;
  124.   word[i]=0;
  125. }
  126.  
  127. getline(f1,line)
  128.   char line[];
  129.   FILE *f1;
  130. {
  131.   int i;
  132.   for(i=0;(line[i]=getc(f1))!='\n';++i);
  133.   line[i]=0;
  134. }
  135.  
  136. argerr()
  137.   printf("Correct usage is    code (-nn) protofile\n");
  138.   exit();
  139. }
  140.  
  141. main(argc,argv)
  142.   int argc;
  143.   char *argv[];
  144. {
  145.   int i,st,ncount;
  146.   char filename[65];
  147.   ncount=1;
  148.   if(argc==1) argerr();
  149.   if(argc>3) argerr();
  150.   if(argc==3)
  151.     {
  152.       ncount=0;
  153.       if(argv[1][0]!='-') argerr();
  154.       for(i=1;argv[1][i] != '\0';++i)ncount=ncount*10+argv[1][i]-'0';
  155.       strncpy(filename,argv[2],64);
  156.     }
  157.   if(argc==2)
  158.     strncpy(filename,argv[1],64);
  159.   st = time(0);
  160.   srand(st);
  161.   init(filename);
  162.   for(i=0;i<ncount;++i)exec("CODE");
  163. }
  164.