448
+ − 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 }