home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / OPENSTEP / Games / NeXTGo-3.0-MIS / godict.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-04  |  5.3 KB  |  268 lines

  1. #include "comment.header"
  2.  
  3. /* $Id: godict.c,v 1.4 1997/11/04 16:52:59 ergo Exp $ */
  4.  
  5. /*
  6.  * $Log: godict.c,v $
  7.  * Revision 1.4  1997/11/04 16:52:59  ergo
  8.  * ported to OpenStep
  9.  *
  10.  * Revision 1.3  1997/07/06 19:35:01  ergo
  11.  * actual version
  12.  *
  13.  * Revision 1.2  1997/05/04 18:57:05  ergo
  14.  * added time control for moves
  15.  *
  16.  */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include "godict.h"
  23.  
  24. #define LANGENTRY(line,label)    (!strncmp(line,label,strlen(label)))
  25. #warning
  26. /*
  27. #ifndef _TEST_COMPILE_
  28. extern int NSRunAlertPanel(const char *title, const char *msg, const char *defaultButton, const char *alternateButton, const char *otherButton, ...);
  29. #endif
  30. */
  31. #ifdef _DEBUG_DICT_
  32. FILE *dump;
  33. #endif
  34.  
  35. GODICT* load_dict(char* filename)
  36. {
  37.   FILE *godictfile;
  38.   GODICT *d, *dp, *d_old;
  39.   char line[MAXDICTLINE];
  40.   int linenr = 0;
  41.  
  42.   dp = NULL;
  43.   d = NULL;
  44.  
  45. #ifdef _DEBUG_DICT_
  46.   dump = fopen("debug.dict","w");
  47. #endif
  48.  
  49.   if ((godictfile = fopen(filename,"r")) == NULL)
  50.     {
  51.       return NULL;
  52.     }
  53.  
  54.   while (fgets(line, MAXDICTLINE, godictfile) != NULL)
  55.     {
  56.       char *newline;
  57.  
  58.       linenr++;
  59.       if ((newline = strchr(line, '\n')) != (char *)0) *newline = 0;
  60.       if ((newline = strchr(line, '\r')) != (char *)0) *newline = 0;
  61.  
  62.       if ((*line == 0) || (*line == COMMENT)) continue;
  63.  
  64.       if (strlen(line) < strlen(RD_CD))
  65.     {
  66.       char s[80];
  67.  
  68.       sprintf(s, "There is a bad entry on line %d.", linenr);
  69. #ifndef _TEST_COMPILE_
  70.       NSRunAlertPanel(@"NeXTGo Dictionary", [NSString stringWithCString:s], @"OK", nil, nil);
  71. #endif
  72.     }
  73.       else if (strncmp(line, RD_CD, strlen(RD_CD)) == 0)
  74.     {
  75.       d_old = d;
  76.       d = (GODICT *) malloc(sizeof(GODICT));
  77.       d->dct_jp = NULL;
  78.       d->dct_ch = NULL;
  79.       d->dct_rk = NULL;
  80.       d->dct_gb = NULL;
  81.       d->dct_nl = NULL;
  82.       d->dct_ge = NULL;
  83.       d->dct_fr = NULL;
  84.       d->dct_sv = NULL;
  85.       d->dct_dg = NULL;
  86.       d->dct_cp = NULL;
  87.  
  88.       if (dp == NULL)
  89.         {
  90.           dp = d;
  91.         }
  92.       else
  93.         {
  94.           d_old->dct_next = d;
  95.         }
  96.  
  97.       switch (*(line+strlen(RD_CD)))
  98.         {
  99.         case 'n':  d->dct_type = CD_NAME;
  100.           break;
  101.         case 'c':  d->dct_type = CD_CHAM;
  102.           break;
  103.         case 't':  d->dct_type = CD_TECH;
  104.           break;
  105.         case 'p':  d->dct_type = CD_POLI;
  106.           break;
  107.         case 'd':  d->dct_type = CD_DIGI;
  108.           break;
  109.         default:  d->dct_type = CD_MISC;
  110.           break;
  111.         }
  112.     }
  113.       else if LANGENTRY(line,RD_JP)
  114.     {
  115.       store_dict(&(d->dct_jp), line+strlen(RD_JP));
  116.     }
  117.       else if LANGENTRY(line,RD_CH)
  118.     {
  119.       store_dict(&(d->dct_ch), line+strlen(RD_CH));
  120.     }
  121.       else if LANGENTRY(line,RD_RK)
  122.     {
  123.       store_dict(&(d->dct_rk), line+strlen(RD_RK));
  124.     }
  125.       else if LANGENTRY(line,RD_GB)
  126.     {
  127.       store_dict(&(d->dct_gb), line+strlen(RD_GB));
  128.     }
  129.       else if LANGENTRY(line,RD_NL)
  130.     {
  131.       store_dict(&(d->dct_nl), line+strlen(RD_NL));
  132.     }
  133.       else if LANGENTRY(line,RD_GE)
  134.     {
  135.       store_dict(&(d->dct_ge), line+strlen(RD_GE));
  136.     }
  137.       else if LANGENTRY(line,RD_FR)
  138.     {
  139.       store_dict(&(d->dct_fr), line+strlen(RD_FR));
  140.     }
  141.       else if LANGENTRY(line,RD_SV)
  142.     {
  143.       store_dict(&(d->dct_sv), line+strlen(RD_SV));
  144.     }
  145.       else if LANGENTRY(line,RD_DG)
  146.     {
  147.       store_dict(&(d->dct_dg), line+strlen(RD_DG));
  148.     }
  149.       else if LANGENTRY(line,RD_CP)
  150.     {
  151.       store_dict(&(d->dct_cp), line+strlen(RD_CP));
  152.     }
  153.  
  154.     }
  155.  
  156.   fclose(godictfile);
  157.   return dp;
  158. }
  159.  
  160. void store_dict(char **f, char *s)
  161. {
  162.   int more = (*f != NULL);
  163.   long needed = strlen(s) + 1;
  164.  
  165.   if (!*s) return;
  166.  
  167.   if (more)
  168.     {
  169.       needed += strlen(*f) + 1;
  170.       *f = (char *) realloc(*f, needed);
  171.     }
  172.   else
  173.     {
  174.       *f = (char *) malloc(needed);
  175.     }
  176.  
  177.   if (more)
  178.     {
  179.       strcat(*f, "\n");
  180.       strcat(*f, lstr(s));
  181.     }
  182.   else
  183.     {
  184.       strcpy(*f, lstr(s));
  185.     }
  186. #ifdef _DEBUG_DICT_
  187.   fprintf(dump,"Added:  %s",s);
  188. #endif
  189. }
  190.  
  191. char* lstr(char *s)
  192. {
  193.   char *t;
  194.  
  195.   for (t = s; *t; t++)
  196.     if (isupper(*t))
  197.       *t = tolower(*t);
  198.  
  199.   return s;
  200. }
  201.  
  202. int substr(char s[], char sub_s[])
  203. {
  204.   int i, j, k;
  205.  
  206.   if (s == NULL || sub_s == NULL)
  207.     return 0;
  208.  
  209.   if (strlen(s) < strlen(sub_s))
  210.     return 0;
  211.  
  212.   for (i = 0; i < strlen(s) - strlen(sub_s); i++)
  213.     {
  214.       k = 1;
  215.       for (j = 0; (j < strlen(sub_s)) && k; j++)
  216.     {
  217.       if (sub_s[j] != s[i+j]) k = 0;
  218.     }
  219.       if (k)
  220.     {
  221.       return 1;
  222.     }
  223.     }
  224.  
  225.   return 0;
  226. }
  227.  
  228. int termtypes, languages;
  229.  
  230. GODICT* search_dict(GODICT* gd, char* term)
  231. {
  232.   GODICT *d;
  233.   char s[80];
  234.  
  235.   d = gd;
  236.   term = lstr(term);
  237.   sprintf(s,"Starting search for %s.",term);
  238.   while (d != NULL)
  239.     {
  240.       if (d->dct_type & termtypes)
  241.     {
  242.       if ((languages & (LANG_JP)) && d->dct_jp && strstr(d->dct_jp,term))
  243.         return d;
  244.       if ((languages & (LANG_CH)) && d->dct_ch && strstr(d->dct_ch,term))
  245.         return d;
  246.       if ((languages & (LANG_RK)) && d->dct_rk && strstr(d->dct_rk,term))
  247.         return d;
  248.       if ((languages & (LANG_GB)) && d->dct_gb && strstr(d->dct_gb,term))
  249.         return d;
  250.       if ((languages & (LANG_NL)) && d->dct_nl && strstr(d->dct_nl,term))
  251.         return d;
  252.       if ((languages & (LANG_GE)) && d->dct_ge && strstr(d->dct_ge,term))
  253.         return d;
  254.       if ((languages & (LANG_FR)) && d->dct_fr && strstr(d->dct_fr,term))
  255.         return d;
  256.       if ((languages & (LANG_SV)) && d->dct_sv && strstr(d->dct_sv,term))
  257.         return d;
  258.       if ((languages & (LANG_DG)) && d->dct_dg && strstr(d->dct_dg,term))
  259.         return d;
  260.       if ((languages & (LANG_CP)) && d->dct_cp && strstr(d->dct_cp,term))
  261.         return d;
  262.     }
  263.       d = d->dct_next;
  264.     }
  265.  
  266.   return NULL;
  267. }
  268.