home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / CBUFF09.ZIP / SRC.ZIP / SYMBOLS.C < prev    next >
C/C++ Source or Header  |  1993-11-16  |  12KB  |  351 lines

  1. /*  $Id: symbols.c,v 1.1.1.1 1993/06/21 11:12:00 anjo Exp $
  2.  *  
  3.  *  File    symbols.c
  4.  *  Part of    ChessBase utilities file format (CBUFF)
  5.  *  Author    Anjo Anjewierden, anjo@swi.psy.uva.nl
  6.  *  Purpose    Handling of chess symbols and other special characters
  7.  *  Works with    GNU CC 2.4.5
  8.  *  
  9.  *  Notice    Copyright (c) 1993  Anjo Anjewierden
  10.  *  
  11.  *  History    19/06/93  (Created)
  12.  *          08/11/93  (Last modified)
  13.  */ 
  14.  
  15.  
  16. /*------------------------------------------------------------
  17.  *  Directives
  18.  *------------------------------------------------------------*/
  19.  
  20. #include "cbuff.h"
  21.  
  22.  
  23. /*------------------------------------------------------------
  24.  *  Definitions
  25.  *------------------------------------------------------------*/
  26.  
  27. char *        SymbolNames[LAST_SYMBOL];
  28. char *        AsciiSymbols[LAST_SYMBOL];
  29.  
  30. static char *    quotedString(char *);
  31.  
  32.  
  33. static int    ChessSymbol[] =
  34.            /*      0              1              2              3
  35.            4              5              6              7 */
  36. /* 0200 */ { CEDILLE_C,     UMLAUT_u,      ACUTE_e,       CIRCUMFLEX_a,
  37.              UMLAUT_a,      GRAVE_a,       DOT_a,         CEDILLE_c,
  38. /* 0210 */   CIRCUMFLEX_e,  UMLAUT_e,       GRAVE_e,       UMLAUT_i,
  39.          CIRCUMFLEX_i,  GRAVE_i,       UMLAUT_A,      DOT_A,
  40. /* 0220 */   ACUTE_E,        SCANDI_ae,     SCANDI_AE,      CIRCUMFLEX_o,
  41.          UMLAUT_o,      GRAVE_o,       CIRCUMFLEX_u,  GRAVE_u,
  42. /* 0230 */   UMLAUT_y,      UMLAUT_O,      UMLAUT_U,      0   ,
  43.          0   ,        0   ,       GERMAN_S,      0   ,
  44. /* 0240 */   ACUTE_a,        ACUTE_i,       ACUTE_o,      ACUTE_u,
  45.          TILDE_n,        TILDE_N,       0   ,      0   ,
  46. /* 0250 */   0   ,        0   ,       0   ,      0   ,
  47.          QUEEN_SYMBOL,  0   ,       0   ,      0   ,
  48. /* 0260 */   ETC,           KING_SYMBOL,   QUEEN_SYMBOL,  KNIGHT_SYMBOL,
  49.          BISHOP_SYMBOL, ROOK_SYMBOL,   PAWN_SYMBOL,   QUARTER,
  50. /* 0270 */   HALF,          THREE_QUARTERS,0   ,          WHITE_ADVANTAGE,
  51.          WHITE_BETTER,WHITE_COMPENSATION, UNCLEAR,    BLACK_COMPENSATION,
  52. /* 0300 */   BLACK_BETTER, BLACK_ADVANTAGE, BISHOP_PAIR,  OPPOSITE_BISHOPS,
  53.          SAME_BISHOPS,  WORSE_IS,      BETTER_IS,     BETTER_IS,
  54. /* 0310 */   SPACE_ADVANTAGE, ONLY_MOVE,   WITH_IDEA,     QUEENS_SIDE,
  55.          KINGS_SIDE,    KINGS_SIDE,    QUEENS_SIDE,   WITH_INITIATIVE,
  56. /* 0320 */   WITH_ATTACK,   WITH_COUNTERPLAY, DIAGONAL,   CENTRE,
  57.          LINE_FILE,     ENDGAME,       WEAK_POINT,    ZUGZWANG,
  58. /* 0330 */   TIME_TROUBLE,  PAWN_EVALUATION, PAWN_CONNECTION, DOUBLE_PAWN,
  59.          PASSED_PAWN,   0   ,          0   ,          DEVELOPMENT_ADVANTAGE,
  60. /* 0340 */   0   , GERMAN_S, 0   ,   0   ,   0   ,   0   ,   0   ,   0   ,
  61. /* 0350 */   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,
  62. /* 0360 */   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,   0   ,
  63. /* 0370 */   0   ,   0   ,   0   ,   0   ,   0   ,   0   , NEXT_LINE,0   
  64. };
  65.  
  66.  
  67. /*------------------------------------------------------------
  68.  *  Initialisation
  69.  *------------------------------------------------------------*/
  70.  
  71. void
  72. initChessSymbols()
  73. { int i;
  74.  
  75.   for (i=0; i<LAST_SYMBOL; i++)
  76.     SymbolNames[i] = AsciiSymbols[i] = 0   ;
  77.   
  78.   SymbolNames[ETC] = "Etc";
  79.   SymbolNames[KING_SYMBOL] = "KingSymbol";
  80.   SymbolNames[QUEEN_SYMBOL] = "QueenSymbol";
  81.   SymbolNames[ROOK_SYMBOL] = "RookSymbol";
  82.   SymbolNames[BISHOP_SYMBOL] = "BishopSymbol";
  83.   SymbolNames[KNIGHT_SYMBOL] = "KnightSymbol";
  84.   SymbolNames[PAWN_SYMBOL] = "PawnSymbol";
  85.   SymbolNames[QUARTER] = "Quarter";
  86.   SymbolNames[HALF] = "Half";
  87.   SymbolNames[THREE_QUARTERS] = "ThreeQuarters";
  88.   SymbolNames[WHITE_BETTER] = "WhiteBetter";
  89.   SymbolNames[WHITE_ADVANTAGE] = "WhiteAdvantage";
  90.   SymbolNames[WHITE_WINNING] = "WhiteWinning";
  91.   SymbolNames[BLACK_BETTER] = "BlackBetter";
  92.   SymbolNames[BLACK_ADVANTAGE] = "BlackAdvantage";
  93.   SymbolNames[BLACK_WINNING] = "BlackWinning";
  94.   SymbolNames[WHITE_COMPENSATION] = "WhiteCompensation";
  95.   SymbolNames[BLACK_COMPENSATION] = "BlackCompensation";
  96.   SymbolNames[UNCLEAR] = "Unclear";
  97.   SymbolNames[BISHOP_PAIR] = "BishopPair";
  98.   SymbolNames[OPPOSITE_BISHOPS] = "OppositeBishops";
  99.   SymbolNames[SAME_BISHOPS] = "SameBishops";
  100.   SymbolNames[DOUBLE_PAWN] = "DoublePawn";
  101.   SymbolNames[PASSED_PAWN] = "PassedPawn";
  102.   SymbolNames[ISOLATED_PAWN] = "IsolatedPawn";
  103.   SymbolNames[CONNECTED_PAWN] = "ConnectedPawn";
  104.   SymbolNames[WORSE_IS] = "WorseIs";
  105.   SymbolNames[BETTER_IS] = "BetterIs";
  106.   SymbolNames[SPACE_ADVANTAGE] = "SpaceAdvantage";
  107.   SymbolNames[ONLY_MOVE] = "OnlyMove";
  108.   SymbolNames[WITH_IDEA] = "WithIdea";
  109.   SymbolNames[QUEENS_SIDE] = "QueensSide";
  110.   SymbolNames[KINGS_SIDE] = "KingsSide";
  111.   SymbolNames[WITH] = "With";
  112.   SymbolNames[WITHOUT] = "Without";
  113.   SymbolNames[WITH_INITIATIVE] = "WithInitiative";
  114.   SymbolNames[WITH_ATTACK] = "WithAttack";
  115.   SymbolNames[WITH_COUNTERPLAY] = "WithCounterplay";
  116.   SymbolNames[DIAGONAL] = "Diagonal";
  117.   SymbolNames[CENTRE] = "Centre";
  118.   SymbolNames[LINE_FILE] = "LineFile";
  119.   SymbolNames[ENDGAME] = "Endgame";
  120.   SymbolNames[ZUGZWANG] = "Zugzwang";
  121.   SymbolNames[TIME_TROUBLE] = "TimeTrouble";
  122.   SymbolNames[DEVELOPMENT_ADVANTAGE] = "DevelopmentAdvantage";
  123.   SymbolNames[WHITE_WINS] = "WhiteWins";
  124.   SymbolNames[BLACK_WINS] = "BlackWins";
  125.   SymbolNames[DRAW] = "Draw";
  126.   SymbolNames[EQUALITY] = "Equality";
  127.   SymbolNames[NOVELTY] = "Novelty";
  128.   SymbolNames[COMPENSATION] = "Compensation";
  129.   SymbolNames[WEAK_POINT] = "WeakPoint";
  130.   SymbolNames[PAWN_EVALUATION] = "PawnEvaluation";
  131.   SymbolNames[PAWN_CONNECTION] = "PawnConnection";
  132.   SymbolNames[UMLAUT_u] = "Umlaut_u";
  133.   SymbolNames[UMLAUT_a] = "Umlaut_a";
  134.   SymbolNames[UMLAUT_U] = "Umlaut_U";
  135.   SymbolNames[GERMAN_S] = "German_S";
  136.   SymbolNames[NEXT_LINE] = "NextLine";
  137.   SymbolNames[EDITORIAL_COMMENT] = "EditorialComment";
  138.   SymbolNames[GOOD_MOVE] = "GoodMove";
  139.   SymbolNames[BAD_MOVE] = "BadMove";
  140.   SymbolNames[INTERESTING_MOVE] = "InterestingMove";
  141.   SymbolNames[DUBIOUS_MOVE] = "DubiousMove";
  142.   SymbolNames[BRILLIANT_MOVE] = "BrilliantMove";
  143.   SymbolNames[BLUNDER] = "Blunder";
  144.   SymbolNames[MATE] = "Mate";
  145.   SymbolNames[CEDILLE_C] = "Cedille_C";
  146.   SymbolNames[ACUTE_e] = "Acute_e";
  147.   SymbolNames[CIRCUMFLEX_a] = "Circumflex_a";
  148.   SymbolNames[GRAVE_a] = "Grave_a";
  149.   SymbolNames[DOT_a] = "Dot_a";
  150.   SymbolNames[CEDILLE_c] = "Cedille_c";
  151.   SymbolNames[CIRCUMFLEX_e] = "Circumflex_e";
  152.   SymbolNames[UMLAUT_e] = "Umlaut_e";
  153.   SymbolNames[GRAVE_e] = "Grave_e";
  154.   SymbolNames[UMLAUT_i] = "Umlaut_i";
  155.   SymbolNames[CIRCUMFLEX_i] = "Circumflex_i";
  156.   SymbolNames[GRAVE_i] = "Grave_i";
  157.   SymbolNames[UMLAUT_A] = "Umlaut_A";
  158.   SymbolNames[DOT_A] = "Dot_A";
  159.   SymbolNames[ACUTE_E] = "Acute_E";
  160.   SymbolNames[SCANDI_ae] = "Scandi_ae";
  161.   SymbolNames[SCANDI_AE] = "Scandi_AE";
  162.   SymbolNames[CIRCUMFLEX_o] = "Circumflex_o";
  163.   SymbolNames[GRAVE_o] = "Grave_o";
  164.   SymbolNames[CIRCUMFLEX_u] = "Circumflex_u";
  165.   SymbolNames[GRAVE_u] = "Grave_u";
  166.   SymbolNames[UMLAUT_y] = "Umlaut_y";
  167.   SymbolNames[UMLAUT_O] = "Umlaut_O";
  168.   SymbolNames[ACUTE_a] = "Acute_a";
  169.   SymbolNames[ACUTE_i] = "Acute_i";
  170.   SymbolNames[ACUTE_o] = "Acute_o";
  171.   SymbolNames[ACUTE_u] = "Acute_u";
  172.   SymbolNames[TILDE_n] = "Tilde_n";
  173.   SymbolNames[TILDE_N] = "Tilde_N";
  174.   SymbolNames[CASTLING_SHORT] = "CastlingShort";
  175.   SymbolNames[CASTLING_LONG] = "CastlingLong";
  176.   SymbolNames[CAPTURE_SYMBOL] = "CaptureSymbol";
  177.   SymbolNames[INCHECK_SYMBOL] = "IncheckSymbol";
  178.   SymbolNames[MOVE_HYPHEN] = "MoveHyphen";
  179.   SymbolNames[PROMOTION_SYMBOL] = "PromotionSymbol";
  180.   SymbolNames[WHITE_MOVE_SYMBOL] = "WhiteMoveSymbol";
  181.   SymbolNames[BLACK_MOVE_SYMBOL] = "BlackMoveSymbol";
  182.   SymbolNames[START_MAJOR_ALTERNATIVE] = "StartMajorAlternative";
  183.   SymbolNames[END_MAJOR_ALTERNATIVE] = "EndMajorAlternative";
  184.   SymbolNames[START_ALTERNATIVE] = "StartAlternative";
  185.   SymbolNames[END_ALTERNATIVE] = "EndAlternative";
  186.   SymbolNames[START_COMMENT] = "StartComment";
  187.   SymbolNames[END_COMMENT] = "EndComment";
  188.   SymbolNames[START_SUB_ALTERNATIVE] = "StartSubAlternative";
  189.   SymbolNames[START_DIAGRAM] = "StartDiagram";
  190.   SymbolNames[END_DIAGRAM] = "EndDiagram";
  191.   SymbolNames[START_DIAGRAM_RANK] = "StartDiagramRank";
  192.   SymbolNames[END_DIAGRAM_RANK] = "EndDiagramRank";
  193.   SymbolNames[DIAGRAM_WK] = "DiagramWK";
  194.   SymbolNames[DIAGRAM_WQ] = "DiagramWQ";
  195.   SymbolNames[DIAGRAM_WR] = "DiagramWR";
  196.   SymbolNames[DIAGRAM_WB] = "DiagramWB";
  197.   SymbolNames[DIAGRAM_WN] = "DiagramWN";
  198.   SymbolNames[DIAGRAM_WP] = "DiagramWP";
  199.   SymbolNames[DIAGRAM_BK] = "DiagramBK";
  200.   SymbolNames[DIAGRAM_BQ] = "DiagramBQ";
  201.   SymbolNames[DIAGRAM_BR] = "DiagramBR";
  202.   SymbolNames[DIAGRAM_BB] = "DiagramBB";
  203.   SymbolNames[DIAGRAM_BN] = "DiagramBN";
  204.   SymbolNames[DIAGRAM_BP] = "DiagramBP";
  205.   SymbolNames[DIAGRAM_WHITE_SQUARE] = "DiagramWhiteSquare";
  206.   SymbolNames[DIAGRAM_BLACK_SQUARE] = "DiagramBlackSquare";
  207.  
  208.   { FILE *fd;
  209.  
  210.     fd = fopenCbuffFile("ascii.sym", "r");
  211.     if (fd == NULL)
  212.     { fprintf(stderr, "Fatal: could not open ``ascii.sym''\n");
  213.       exit(1);
  214.     }
  215.     loadChessSymbols(fd);
  216.     fclose(fd);
  217.   }
  218. }
  219.  
  220.  
  221. /*------------------------------------------------------------
  222.  *  Loading
  223.  *------------------------------------------------------------*/
  224.  
  225. void
  226. loadChessSymbols(FILE *fd)
  227. { char line[MAX_LINE_SIZE+1];
  228.   char *s;
  229.   int n;
  230.   
  231.   while (fgets(line, MAX_LINE_SIZE, fd))
  232.   { if (!isupper(line[0]))
  233.       continue;            
  234.     s = strchr(line, ':');    
  235.     if (s == NULL)
  236.     { fprintf(stderr, "Warning: no ``:'' seen on line\n\t%s\n", s);
  237.       continue;
  238.     }
  239.     *s++ = '\0';
  240.     for (n=0; n<LAST_SYMBOL; n++)
  241.     { if (SymbolNames[n] && strcmp(line, SymbolNames[n]) == 0)
  242.       { AsciiSymbols[n] = allocCharp(quotedString(s));
  243.     break;
  244.       }
  245.     }
  246.     if (n >= LAST_SYMBOL)
  247.       fprintf(stderr, "Warning: %s not a known chess symbol name\n", line);
  248.   }
  249. }
  250.  
  251.  
  252. /*------------------------------------------------------------
  253.  *  Printing
  254.  *------------------------------------------------------------*/
  255.  
  256. void
  257. printChessSymbols(FILE *fd)
  258. { int n;
  259.  
  260.   for (n=0; n<LAST_SYMBOL; n++)
  261.     if (SymbolNames[n])
  262.       fprintf(fd, "%-30s: %s\n", SymbolNames[n], AsciiSymbols[n]);
  263. }
  264.  
  265.  
  266. /*------------------------------------------------------------
  267.  *  Principle Functions
  268.  *------------------------------------------------------------*/
  269.  
  270. char *
  271. chessSymbol(int symbol)
  272. { if (symbol < LAST_SYMBOL && AsciiSymbols[symbol])
  273.     return AsciiSymbols[symbol];
  274.   setIntError(symbol);
  275.   setError(ERR_UNKNOWN_SYMBOL);
  276. abort();
  277.   return "";
  278. }
  279.  
  280.  
  281. char *
  282. mapChessSymbol(unsigned char c)
  283. { int value;
  284.  
  285.   value = ChessSymbol[c & 0177];
  286.  
  287.   if (value == 0)
  288.   { setIntError(c);
  289.     setError(ERR_UNKNOWN_SYMBOL);
  290.     return "";
  291.   }
  292.  
  293.   return chessSymbol((int) value);
  294. }
  295.  
  296.  
  297. char *
  298. stringChessSymbol(char *s, char *t)
  299. { char *result;
  300.  
  301.   for (result=t; *s; s++)
  302.   { if (*s >= ' ' && *s < '\177')
  303.     { *result++ = *s;
  304.       continue;
  305.     }
  306.     if (*s == '\177')            /*  */
  307.     { strcpy(result, chessSymbol(WITH_IDEA));
  308.       result = strchr(result, '\0');
  309.       continue;
  310.     }
  311.     if (*s == REQUEST_DIAGRAM)
  312.       continue;
  313.     strcpy(result, mapChessSymbol(*s));
  314.     result = strchr(result, '\0');
  315.   }
  316.   *result = '\0';
  317.   return t;
  318. }
  319.  
  320.  
  321. /*------------------------------------------------------------
  322.  *  Private functions
  323.  *------------------------------------------------------------*/
  324.  
  325. static char *
  326. quotedString(char *s)
  327. { char quote;
  328.   char *t, *u;
  329.  
  330.   while (*s && isspace(*s))
  331.     s++;
  332.   if (*s == '\0')
  333.     return s;
  334.   quote = *s++;
  335.   for (t=s, u=s; *t; t++)
  336.   { if (*t == quote)
  337.       break;
  338.     if (*t == '\\')
  339.     { switch (*++t)
  340.       { case 'n':    *u++ = '\n';  continue;
  341.         case 't':    *u++ = '\t';  continue;
  342.     default:    *u++ = *t;    continue;
  343.       }
  344.     }
  345.     *u++ = *t;
  346.   }
  347.   *u = '\0';
  348.  
  349.   return s;
  350. }
  351.