view oldclasslib/include/strdict.h @ 7:57b2cc9b87f7

Use memcpy instead of strncpy when we know the length anyway. Modern gcc seems to think it knows how to detect misuse of strncpy, but it's wrong (in fact: very, very wrong) and the path of least resistance is to not try to fight with it.
author David A. Holland
date Mon, 30 May 2022 23:47:52 -0400
parents 607e3be6bad8
children
line wrap: on
line source

/*
 * AnaGram, a System for Syntax Directed Programmng
 * String Dictionary Class Definition
 *
 * Copyright 1993 Parsifal Software. All Rights Reserved.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

#ifndef STRDICT_H
#define STRDICT_H

class string_dictionary {
  unsigned *sxs;                 // Storage for string indices
  char *cs;                      // Storage for character strings
  unsigned csx;                  // Next available location in cs
  unsigned csxmax;               // Size of cs
  unsigned ns;                   // Number of strings in dictionary
  unsigned nsmax;                // Max number of strings
  unsigned *ht;                  // Hash table storage
  unsigned htl;                  // Size of hash table
  unsigned htmask;               // Hash table mask
  unsigned hash(const char *);   // Hash function
  unsigned n_calls;              // Number of calls
  unsigned n_collisions;         // Number of collisions
  int copy_flag;                 // Is it live or is it memorex?
public:


// Constructors

  string_dictionary(unsigned size, unsigned word_length = 10);

  string_dictionary(const string_dictionary &);

  void operator = (const string_dictionary &);

// Destructor

  ~string_dictionary();


// Reset String Dictionary

  friend string_dictionary &reset(string_dictionary &);


// Enter a String in Dictionary

  unsigned operator << (const char *);   // Insert string


// Look up a String in Dictionary

  unsigned operator [] (const char *);   // Look up string


// Recover String from Dictionary Index

  char * operator [] (unsigned);   // Find string


// Find Number of Entries in Dictionary

  friend unsigned size(string_dictionary &);
};

#endif