comparison src/elhash.c @ 2421:ab71ad6ff3dd

[xemacs-hg @ 2004-12-06 03:50:53 by ben] (none) README.packages: Document use of --package-prefix. Fix error in specifying standard package location. make-docfile.c: Use QXE_PATH_MAX. info.el: Correct doc string giving example package path. menubar-items.el: Move Prefix Rectangle command up one level. xemacs/packages.texi: Add long form of Lisp Reference Manual to links. Add links pointing to Lisp Reference Manual for more detailed package discussion. lispref/range-tables.texi: Document range-table changes. internals/internals.texi: Update history section. elhash.c, elhash.h, profile.c: Create inchash_eq() to allow direct incrementing of hash-table entry. Use in profile.c to try to reduce profiling overhead. Increase initial size of profile hash tables to reduce profiling overhead. buffer.c, device-msw.c, dialog-msw.c, dired-msw.c, editfns.c, event-msw.c, events.c, glyphs-msw.c, keymap.c, objects-msw.c, process-nt.c, syswindows.h, text.c, text.h, unexnt.c: Rename xetcs* -> qxetcs* for consistency with qxestr*. Rename ei*_c(_*) -> ei*_ascii(_*) since they work with ASCII-only strings not "C strings", whatever those are. This is the last place where "c" was incorrectly being used for "ascii". dialog-msw.c, dumper.c, event-msw.c, fileio.c, glyphs-gtk.c, glyphs-x.c, nt.c, process-nt.c, realpath.c, sysdep.c, sysfile.h, unexcw.c, unexnext.c, unexnt.c: Try to avoid differences in systems that do or do not include final null byte in PATH_MAX. Create PATH_MAX_INTERNAL and PATH_MAX_EXTERNAL and use them everywhere. Rewrite code in dumper.c to avoid use of PATH_MAX. When necessary in nt.c, use _MAX_PATH instead of MAX_PATH to be consistent with other places. text.c: Code to short-circuit when binary or Unicode was not working due to EOL wrapping. Fix this code to work when either no EOL autodetection or no CR's or LF's in the text. lisp.h, rangetab.c, rangetab.h, regex.c, search.c: Implement different types of ranges (open/closed start and end). Change default to be start-closed, end-open.
author ben
date Mon, 06 Dec 2004 03:52:23 +0000
parents ecf1ebac70d8
children 3d8143fc88e1
comparison
equal deleted inserted replaced
2420:ad56e5a6d09f 2421:ab71ad6ff3dd
1 /* Implementation of the hash table lisp object type. 1 /* Implementation of the hash table lisp object type.
2 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. 2 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3 Copyright (C) 1995, 1996, 2002 Ben Wing. 3 Copyright (C) 1995, 1996, 2002, 2004 Ben Wing.
4 Copyright (C) 1997 Free Software Foundation, Inc. 4 Copyright (C) 1997 Free Software Foundation, Inc.
5 5
6 This file is part of XEmacs. 6 This file is part of XEmacs.
7 7
8 XEmacs is free software; you can redistribute it and/or modify it 8 XEmacs is free software; you can redistribute it and/or modify it
400 print_hash_table_data (ht, printcharfun); 400 print_hash_table_data (ht, printcharfun);
401 401
402 if (print_readably) 402 if (print_readably)
403 write_c_string (printcharfun, ")"); 403 write_c_string (printcharfun, ")");
404 else 404 else
405 { 405 write_fmt_string (printcharfun, " 0x%x>", ht->header.uid);
406 write_fmt_string (printcharfun, " 0x%x>", ht->header.uid);
407 }
408 } 406 }
409 407
410 static void 408 static void
411 free_hentries (htentry *hentries, 409 free_hentries (htentry *hentries,
412 #ifdef ERROR_CHECK_STRUCTURES 410 #ifdef ERROR_CHECK_STRUCTURES
788 Lisp_Object rehash_size = Qnil; 786 Lisp_Object rehash_size = Qnil;
789 Lisp_Object rehash_threshold = Qnil; 787 Lisp_Object rehash_threshold = Qnil;
790 Lisp_Object weakness = Qnil; 788 Lisp_Object weakness = Qnil;
791 Lisp_Object data = Qnil; 789 Lisp_Object data = Qnil;
792 790
793 while (!NILP (plist)) 791 PROPERTY_LIST_LOOP_3 (key, value, plist)
794 { 792 {
795 Lisp_Object key, value;
796 key = XCAR (plist); plist = XCDR (plist);
797 value = XCAR (plist); plist = XCDR (plist);
798
799 if (EQ (key, Qtest)) test = value; 793 if (EQ (key, Qtest)) test = value;
800 else if (EQ (key, Qsize)) size = value; 794 else if (EQ (key, Qsize)) size = value;
801 else if (EQ (key, Qrehash_size)) rehash_size = value; 795 else if (EQ (key, Qrehash_size)) rehash_size = value;
802 else if (EQ (key, Qrehash_threshold)) rehash_threshold = value; 796 else if (EQ (key, Qrehash_threshold)) rehash_threshold = value;
803 else if (EQ (key, Qweakness)) weakness = value; 797 else if (EQ (key, Qweakness)) weakness = value;
1061 LINEAR_PROBING_LOOP (probe, entries, ht->size) 1055 LINEAR_PROBING_LOOP (probe, entries, ht->size)
1062 if (KEYS_EQUAL_P (probe->key, key, test_function)) 1056 if (KEYS_EQUAL_P (probe->key, key, test_function))
1063 break; 1057 break;
1064 1058
1065 return probe; 1059 return probe;
1060 }
1061
1062 /* A version of Fputhash() that increments the value by the specified
1063 amount and dispenses will all error checks. Assumes that tables does
1064 comparison using EQ. Used by the profiling routines to avoid
1065 overhead -- profiling overhead was being recorded at up to 15% of the
1066 total time. */
1067
1068 void
1069 inchash_eq (Lisp_Object key, Lisp_Object table, EMACS_INT offset)
1070 {
1071 Lisp_Hash_Table *ht = XHASH_TABLE (table);
1072 htentry *entries = ht->hentries;
1073 htentry *probe = entries + HASHCODE (key, ht);
1074
1075 LINEAR_PROBING_LOOP (probe, entries, ht->size)
1076 if (EQ (probe->key, key))
1077 break;
1078
1079 if (!HTENTRY_CLEAR_P (probe))
1080 probe->value = make_int (XINT (probe->value) + offset);
1081 else
1082 {
1083 probe->key = key;
1084 probe->value = make_int (offset);
1085
1086 if (++ht->count >= ht->rehash_count)
1087 enlarge_hash_table (ht);
1088 }
1066 } 1089 }
1067 1090
1068 DEFUN ("gethash", Fgethash, 2, 3, 0, /* 1091 DEFUN ("gethash", Fgethash, 2, 3, 0, /*
1069 Find hash value for KEY in HASH-TABLE. 1092 Find hash value for KEY in HASH-TABLE.
1070 If there is no corresponding value, return DEFAULT (which defaults to nil). 1093 If there is no corresponding value, return DEFAULT (which defaults to nil).