view netinstall/hash.cc @ 1346:01c57eb70ae9

[xemacs-hg @ 2003-03-09 02:27:27 by ben] To: xemacs-patches@xemacs.org i.c: Sleep between calls to check for I/O, since these calls are non-blocking. behavior.el: Allow other keywords for forward compatibility. cl-macs.el: Rewrite to eliminate byte-compiler warning when `return' is used without `finally'. cmdloop.el: Avoid truncated error messages for `end-of-file' and the like. cmdloop.el: Avoid char-int error after syncing. files.el: Eliminate byte-compile warnings. printer.el: Fix line-width calculations. #### This used to work. Someone's changes (perhaps by Michael Sperber?) seem to have messed something up. simple.el: Use new clear-left-side functions to avoid messages ending up on the same line as other output. xemacs.mak: Add override for info/ as well when separate source/build dirs. xemacs.mak: Order sections in main build process and add comments. Add additional dependencies to try and prevent later steps from happening when failures in earlier steps have occurred. Makefile.in.in: Order sections in main build process and add comments. Add additional dependencies to try and prevent later steps from happening when failures in earlier steps have occurred. alloc.c: Don't arbitrarily clear Vconfigure_info_directory since it messes up separate build/source dirs. console.c, console.h, device-msw.c, device.c: Add accidentally omitted msprinter console and data descriptions. print.c, console-msw.c: Add clear-left-side functionality to help keep stdio/stderr output from separate sources on separate lines. Generalize the different kinds of debugging output. Add dpa(). profile.c: Add better docs on Unix/Windows differences. regex.c: Fix problems with rel-alloc compilation caused by previous patch. emacs.c: Seg fault rather than abort on Cygwin, since gdb doesn't trap aborts properly. console-gtk-impl.h, console-gtk.h, console-msw.h, console-x-impl.h, console-x.h, dialog-gtk.c, dialog-x.c, event-msw.c, frame-gtk.c, frame-x.c, frameslots.h, glyphs-gtk.c, glyphs-x.c, gui-gtk.c, gui-x.c, inline.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, scrollbar-gtk.c, scrollbar-x.c, ui-gtk.c: Delete popup-data object. Delete menubar_data field from frames, since its usage is frame-specific. Delete menubar-msw.h, gui-x.h, gui-gtk.h. Clean up handling of lwlib callback data GCPRO'ing and add missing GCPRO recomputation in widget code.
author ben
date Sun, 09 Mar 2003 02:27:46 +0000
parents 3078fd1074e8
children
line wrap: on
line source

/*
 * Copyright (c) 2000, Red Hat, Inc.
 *
 *     This program 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 2 of the License, or
 *     (at your option) any later version.
 *
 *     A copy of the GNU General Public License can be found at
 *     http://www.gnu.org/
 *
 * Written by DJ Delorie <dj@cygnus.com>
 *
 */

/* Simple hash class for install.cc */

#include "win32.h"
#include <stdlib.h>
#include <string.h>

#include "hash.h"

class hash_internals {
public:
  char **keys;
  int numkeys;
  int maxkeys;
  int prev_index;
};

hash::hash ()
{
  h = new hash_internals;
  h->numkeys = 0;
  h->maxkeys = 10;
  h->keys = (char **) malloc (h->maxkeys * sizeof (char *));
  h->prev_index = 0;
}

hash::~hash ()
{
  free (h->keys);
  free (h);
}


void
hash::add (char *string)
{
  int i;
  for (i=0; i<h->numkeys; i++)
    if (strcmp (h->keys[i], string) == 0)
      return;
  if (h->numkeys >= h->maxkeys)
    {
      h->maxkeys += 10;
      h->keys = (char **) realloc (h->keys, h->maxkeys * sizeof (char *));
    }

  h->keys[h->numkeys] = _strdup (string);
  h->numkeys ++;
}


int
hash::has (char *string)
{
  int i;
  for (i=0; i<h->numkeys; i++)
    if (strcmp (h->keys[i], string) == 0)
      return 1;
  return 0;
}

char *
hash::enumerate (char *prev)
{
  if (prev == 0)
    h->prev_index = -1;
  h->prev_index ++;
  if (h->prev_index >= h->numkeys)
    return 0;
  return h->keys[h->prev_index];
}

static int CDECL
rev_len (const void *va, const void *vb)
{
  char *a = *(char **)va;
  char *b = *(char **)vb;
  return strcmp (b, a);
}

void
hash::reverse_sort ()
{
  qsort (h->keys, h->numkeys, sizeof (h->keys[0]), rev_len);
}