Net2/usr/src/usr.bin/groff/pic/key.cc

/* C code produced by gperf version 2.3 (GNU C++ version) */
/* Command-line: gperf -p -a -t -k 1,3,4 -c -C -N lookup_keyword -T pic.gperf  */
/* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
     Written by James Clark (jjc@jclark.uucp)

This file is part of groff.

groff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any later
version.

groff is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with groff; see the file LICENSE.  If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "key.h"
#include "pic.h"
#include "ptable.h"
#include "object.h"
#include "pic.tab.h"

#define TOTAL_KEYWORDS 81
#define MIN_WORD_LENGTH 2
#define MAX_WORD_LENGTH 9
#define MIN_HASH_VALUE 2
#define MAX_HASH_VALUE 276
/* maximum key range = 275, duplicates = 0 */

static unsigned int
hash (register const char *str, register int len)
{
  static const unsigned short asso_values[] =
    {
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277,   5, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
     277, 277, 277, 277, 277, 277, 277,  25,  20,  40,
      55,  35, 105,  35,  15, 110, 277, 277,  40,  95,
      25,  70,   7, 277,  30, 100,   0,  85,  20,  17,
       5,   5, 277, 277, 277, 277, 277, 277,
    };
  register int hval = len;

  switch (hval)
    {
      default:
      case 4:
        hval += asso_values[str[3]];
      case 3:
        hval += asso_values[str[2]];
      case 2:
      case 1:
        hval += asso_values[str[0]];
    }
  return hval;
}

const struct keyword *
lookup_keyword (register const char *str, register int len)
{

  static const struct keyword wordlist[] =
    {
      {"to",  TO},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"top",  TOP},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"ht",  HEIGHT},
      {"",}, {"",}, {"",}, {"",}, 
      {"by",  BY},
      {"",}, {"",}, 
      {"way",  WAY},
      {"bottom",  BOTTOM},
      {"at",  AT},
      {"box",  BOX},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"with",  WITH},
      {"",}, 
      {"the",  THE},
      {"",}, {"",}, {"",}, 
      {"cw",  CW},
      {"",}, 
      {"between",  BETWEEN},
      {"exp",  EXP},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"",}, 
      {"copy",  COPY},
      {"do",  DO},
      {"",}, {"",}, 
      {"ccw",  CCW},
      {"dotted",  DOTTED},
      {"",}, {"",}, 
      {"then",  THEN},
      {"",}, {"",}, {"",}, 
      {"arc",  ARC},
      {"",}, {"",}, 
      {"center",  CENTER},
      {"of",  OF},
      {"",}, 
      {"Here",  HERE},
      {"wid",  WIDTH},
      {"",}, 
      {"width",  WIDTH},
      {"log",  LOG},
      {"",}, 
      {"atan2",  ATAN2},
      {"plot",  PLOT},
      {"",}, 
      {"and",  AND},
      {"",}, 
      {"right",  RIGHT},
      {"",}, 
      {"up",  UP},
      {"rad",  RADIUS},
      {"",}, {"",}, {"",}, {"",}, 
      {"end",  END},
      {"",}, {"",}, {"",}, 
      {"lower",  LOWER},
      {"",}, {"",}, {"",}, 
      {"down",  DOWN},
      {"sh",  SH},
      {"max",  MAX},
      {"line",  LINE},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"if",  IF},
      {"int",  INT},
      {"rand",  RAND},
      {"",}, 
      {"circle",  CIRCLE},
      {"",}, {"",}, 
      {"thru",  THRU},
      {"above",  ABOVE},
      {"chop",  CHOP},
      {"",}, 
      {"min",  MIN},
      {"",}, {"",}, {"",}, {"",}, 
      {"sin",  SIN},
      {"",}, 
      {"arrow",  ARROW},
      {"",}, 
      {"upper",  UPPER},
      {"",}, 
      {"sqrt",  SQRT},
      {"below",  BELOW},
      {"",}, {"",}, 
      {"for",  FOR},
      {"",}, {"",}, {"",}, {"",}, 
      {"cos",  COS},
      {"last",  LAST},
      {"",}, {"",}, 
      {"print",  PRINT},
      {"",}, 
      {"left",  LEFT},
      {"",}, {"",}, {"",}, {"",}, 
      {"move",  MOVE},
      {"thick",  THICKNESS},
      {"",}, {"",}, {"",}, 
      {"thickness",  THICKNESS},
      {"start",  START},
      {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"height",  HEIGHT},
      {"",}, {"",}, {"",}, 
      {"reset",  RESET},
      {"",}, {"",}, {"",}, 
      {"else",  ELSE},
      {"",}, 
      {"dashed",  DASHED},
      {"aligned",  ALIGNED},
      {"",}, 
      {"diam",  DIAMETER},
      {"undef",  UNDEF},
      {"",}, {"",}, 
      {"diameter",  DIAMETER},
      {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"fill",  FILL},
      {"",}, 
      {"filled",  FILL},
      {"ellipse",  ELLIPSE},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"until",  UNTIL},
      {"radius",  RADIUS},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      
      {"rjust",  RJUST},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"ljust",  LJUST},
      {"",}, {"",}, {"",}, 
      {"same",  SAME},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"",}, 
      {"invis",  INVISIBLE},
      {"",}, 
      {"sprintf",  SPRINTF},
      {"",}, 
      {"invisible",  INVISIBLE},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"spline",  SPLINE},
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
      {"from",  FROM},
      {"",}, 
      {"define",  DEFINE},
    };

  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
    {
      register int key = hash (str, len) - MIN_HASH_VALUE;

      if (key <= (MAX_HASH_VALUE - MIN_HASH_VALUE) && key >= 0)
        {
          register const char *s = wordlist[key].name;

          if (*s == *str && !strncmp (str + 1, s + 1, len - 1))
            return &wordlist[key];
        }
    }
  return 0;
}