update.
[chise/xemacs-chise.git.1] / netinstall / hash.cc
1 /*
2  * Copyright (c) 2000, Red Hat, Inc.
3  *
4  *     This program is free software; you can redistribute it and/or modify
5  *     it under the terms of the GNU General Public License as published by
6  *     the Free Software Foundation; either version 2 of the License, or
7  *     (at your option) any later version.
8  *
9  *     A copy of the GNU General Public License can be found at
10  *     http://www.gnu.org/
11  *
12  * Written by DJ Delorie <dj@cygnus.com>
13  *
14  */
15
16 /* Simple hash class for install.cc */
17
18 #include "win32.h"
19 #include <stdlib.h>
20 #include <string.h>
21
22 #include "hash.h"
23
24 class hash_internals {
25 public:
26   char **keys;
27   int numkeys;
28   int maxkeys;
29   int prev_index;
30 };
31
32 hash::hash ()
33 {
34   h = new hash_internals;
35   h->numkeys = 0;
36   h->maxkeys = 10;
37   h->keys = (char **) malloc (h->maxkeys * sizeof (char *));
38   h->prev_index = 0;
39 }
40
41 hash::~hash ()
42 {
43   free (h->keys);
44   free (h);
45 }
46
47
48 void
49 hash::add (char *string)
50 {
51   int i;
52   for (i=0; i<h->numkeys; i++)
53     if (strcmp (h->keys[i], string) == 0)
54       return;
55   if (h->numkeys >= h->maxkeys)
56     {
57       h->maxkeys += 10;
58       h->keys = (char **) realloc (h->keys, h->maxkeys * sizeof (char *));
59     }
60
61   h->keys[h->numkeys] = _strdup (string);
62   h->numkeys ++;
63 }
64
65
66 int
67 hash::has (char *string)
68 {
69   int i;
70   for (i=0; i<h->numkeys; i++)
71     if (strcmp (h->keys[i], string) == 0)
72       return 1;
73   return 0;
74 }
75
76 char *
77 hash::enumerate (char *prev)
78 {
79   if (prev == 0)
80     h->prev_index = -1;
81   h->prev_index ++;
82   if (h->prev_index >= h->numkeys)
83     return 0;
84   return h->keys[h->prev_index];
85 }
86
87 static int CDECL
88 rev_len (const void *va, const void *vb)
89 {
90   char *a = *(char **)va;
91   char *b = *(char **)vb;
92   return strcmp (b, a);
93 }
94
95 void
96 hash::reverse_sort ()
97 {
98   qsort (h->keys, h->numkeys, sizeof (h->keys[0]), rev_len);
99 }