home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3221 < prev    next >
Internet Message Format  |  1991-04-20  |  51KB

  1. From: tron1@tronsbox.xei.com (Kenneth Jamieson)
  2. Newsgroups: alt.sources
  3. Subject: X_hash list manager (C/C++)
  4. Message-ID: <1559@tronsbox.xei.com>
  5. Date: 20 Apr 91 04:01:34 GMT
  6.  
  7.  
  8. Submitted by: tron1@tronsbox
  9. Archive-name: X_HASH/part01
  10.  
  11. ---- Cut Here and unpack ----
  12. #!/bin/sh
  13. # This is X_HASH, a shell archive (shar 3.10)
  14. # made 04/20/1991 04:00 UTC by tron1@tronsbox
  15. # Source directory /u1/home/tron1/src/tron1/shareware/x_hash
  16. #
  17. # existing files WILL be overwritten
  18. #
  19. # This is part 1 of a multipart archive                                    
  20. # do not concatenate these parts, unpack them in order with /bin/sh        
  21. #
  22. # This shar contains:
  23. # length  mode       name
  24. # ------ ---------- ------------------------------------------
  25. #   2791 -rw-r----- README
  26. #    241 -r--r----- src/copyr.h
  27. #   1826 -r--r----- src/make.unx
  28. #   3482 -r--r----- src/sharew.h
  29. #   8935 -r--r----- src/testhash.c
  30. #   9141 -r--r----- src/testlist.c
  31. #  10500 -r--r----- src/x_hash.c
  32. #   2075 -r--r----- src/x_hash.h
  33. #   9460 -r--r----- src/x_list.c
  34. #   3415 -r--r----- src/x_list.h
  35. #   1826 -r--r----- src/Makefile
  36. #    107 -rw-r----- text/install
  37. #   9661 -rw-r----- text/lists
  38. #   2856 -rw-r----- text/readme
  39. #   1311 -rw-r----- text/WHATIS
  40. #
  41. touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$
  42. if [ -s /tmp/s3_touch$$ ]
  43. then
  44.     TOUCH=can
  45. else
  46.     TOUCH=cannot
  47. fi
  48. rm -f /tmp/s3_touch$$
  49. if test -r s3_seq_.tmp
  50. then echo "Must unpack archives in sequence!"
  51.      next=`cat s3_seq_.tmp`; echo "Please unpack part $next next"
  52.      exit 1; fi
  53. # ============= README ==============
  54. echo "x - extracting README (Text)"
  55. sed 's/^X//' << 'SHAR_EOF' > README &&
  56. X
  57. X                **************
  58. X                * X_HASH 1.0 *
  59. X                **************
  60. X
  61. X                NOTICE ! ! ! !
  62. X
  63. X    X_HASH IS >SHAREWARE< ! YOU MUST READ AND COMPLY WITH THE TERMS
  64. X    IN THIS FILE IF YOU WISH TO USE THIS DATA IN ANY WAY!!!
  65. X
  66. X        X_HASH IS (C)1991 BY KENNETH JAMIESON
  67. X
  68. X             ALL RIGHTS RESERVED
  69. X
  70. X
  71. XNOTICE:
  72. X
  73. X    THE TERM CODE SHALL BE USED TO MEAN ALL DATA AND SOURCE TEXT
  74. X    PROVIDED WITH THIS PACKAGE. THIS INCLUDES ALL DOC FILES.
  75. X
  76. X    THIS CODE IS "AS IS" , AND NO WARRANTY IS IMPLIED OR GIVEN ABOUT
  77. X    IT BEING ACCURATE OR USEFUL IN ANY WAY FOR ANY PURPOSE. TO THE
  78. X    EXTENT ALLOWED BY LAW THAT AUTHOR CLAIMS NO RESPONSIBILITY FOR
  79. X    DAMAGES, REAL OR PERCEIVED, SUSTAINED FROM THE USE OF THIS CODE OR 
  80. X    THE IDEAS EXPRESSED IN THIS CODE.
  81. X
  82. X    THIS DISCLAIMER APPLIES TO REGISTERED AND UNREGISTERED COPIES
  83. X    OF THIS CODE. PAYMENT TO THE AUTHOR DOES NOT CHANGE THE LACK OF
  84. X    WARRANTY.
  85. X
  86. X
  87. XSHAREWARE TERMS:
  88. X
  89. X    * You will not violate, help to violate, or fail to report the
  90. X      violation of the copyright notice that protects this code.
  91. X
  92. X    * You may not use this code, in whole or part, in any commercial
  93. X      program without the permission of the author. A commercial
  94. X      program is any code, source or object, that the author has
  95. X      asked payment for. This includes shareware.
  96. X
  97. X    * This code must be distributed in it's original form.
  98. X
  99. X    * No special fee may be charged for distributing this code. This
  100. X      means that, for instance, and online service may charge for 
  101. X      downloading programs, but that charge cannot change base on if 
  102. X      it is THIS code that is being accessed.
  103. X
  104. X    * You may use this code for thirty (30) days before payment is
  105. X      due. This evaluation period begins when you first access this
  106. X      code. After that time, you must register this code.
  107. X
  108. X    * Registration allows you to use this code for an unlimited
  109. X      period of time. Not: registration does NOT remove the 
  110. X      restriction on use in commercial code.
  111. X
  112. X    * Contact the author to arrange for use in commercial code.
  113. X
  114. X    * To register, send 15$ to the author:
  115. X
  116. X        Kenneth Jamieson
  117. X        P.o. Box 840 B 
  118. X        Kearny NJ 07032
  119. X
  120. X
  121. X
  122. X              **************************
  123. X
  124. X    Whew! Well, now that that is out of the way I feel better!
  125. X
  126. X    You can reach me at the address above, or at 201-957-2438 (day).
  127. X
  128. X    Also....
  129. X
  130. X    uunet!tronsbox!tron1 
  131. X    tron1@tronsbox 
  132. X    uunet!fdurt1!wisdom!tronsbox!tron1
  133. X
  134. X    See the "text" directory for more info.
  135. X
  136. X========[ Xanadu Enterprises Inc. Amiga & Unix Software Development]=======
  137. X= "I know how you feel, you don't know if you want to hit me or kiss me - =
  138. X=  --- I get a lot of that."  Madonna as Breathless Mahoney (Dick Tracy)  =
  139. X=========== Ken Jamieson: uunet!tronsbox.xei.com!tron1  ===================
  140. X=     NONE of the opinions represented here are endorsed by anybody.      =
  141. X=== The Romantic Encounters BBS 201-759-8450(PEP) / 201-759-8568(2400) ==== 
  142. SHAR_EOF
  143. chmod 0640 README || echo "restore of README fails"
  144. if [ $TOUCH = can ]
  145. then
  146.     touch -am 0419234191 README
  147. fi
  148. # ============= src/copyr.h ==============
  149. if test ! -d 'src' ; then
  150.     echo "x - creating directory src"
  151.     mkdir 'src'
  152. fi
  153. echo "x - extracting src/copyr.h (Text)"
  154. sed 's/^X//' << 'SHAR_EOF' > src/copyr.h &&
  155. X/* 
  156. X         Copyright include notice :    
  157. X     
  158. X     copyr.h 1.1 4/18/91
  159. X
  160. X*/
  161. X
  162. X/* 
  163. XAll text in this file is copyright (c) 1991 by Kenneth Jamieson
  164. X*/
  165. X#ifndef X_COPYRIGHT
  166. X#define X_COPYRIGHT "Compiled from source (c) 1991 Kenneth Jamieson"
  167. X#endif
  168. SHAR_EOF
  169. chmod 0440 src/copyr.h || echo "restore of src/copyr.h fails"
  170. if [ $TOUCH = can ]
  171. then
  172.     touch -am 0418223391 src/copyr.h
  173. fi
  174. # ============= src/make.unx ==============
  175. echo "x - extracting src/make.unx (Text)"
  176. sed 's/^X//' << 'SHAR_EOF' > src/make.unx &&
  177. X# UNIX Makefile for the x_list library
  178. X#
  179. X#     Unix Makefile for x_list functions. 
  180. X#
  181. X#    make.unx 1.1 4/18/91 
  182. X#
  183. X# Set the CC variable to any compiler that can take ANSI C
  184. XCC=CC
  185. X
  186. X# Set any other flags you want the compiler to honor
  187. XCFLAGS=-O -I.. -I. -I../../include -L. -L../../lib
  188. X
  189. X# The command that is used to make an archive 
  190. X# BSD and SUNOS
  191. X# ARCHIVE=ar cr 
  192. X# System V
  193. XARCHIVE=ar -cr 
  194. X
  195. Xall: testlist testhash
  196. X    @echo " "
  197. X    @echo "======================================================="
  198. X    @echo "= Done building x_hash list manager system...         ="
  199. X    @echo "= Run the program 'testit' to see if it works.        ="
  200. X    @echo "= Remember to type 'make install' if all went well.   ="
  201. X    @echo "= Then you can 'make clean' to get rid of temp files. ="
  202. X    @echo "= - - - - - - - - - - - - - - - - - - - - - - - - - - ="
  203. X    @echo "= Please don't forget that this is is shareware!      ="
  204. X    @echo "======================================================="
  205. X    @echo " "
  206. X
  207. Xinstall:
  208. X    cp libx_list.a ../../lib
  209. X    chmod 644 ../../lib/libx_list.a
  210. X    cp x_list.h ../../include
  211. X    chmod 644 ../../include/x_list.h
  212. X    cp libx_hash.a ../../lib
  213. X    chmod 644 ../../lib/libx_hash.a
  214. X    cp x_hash.h ../../include
  215. X    chmod 644 ../../include/x_hash.h
  216. X
  217. Xlibx_list.a: x_list.o 
  218. X    $(ARCHIVE) libx_list.a x_list.o
  219. X    -ranlib libx_list.a
  220. X
  221. Xx_list.o: x_list.c x_list.h 
  222. X    $(CC) $(CFLAGS) -c x_list.c
  223. X
  224. Xtestlist: testlist.c libx_list.a x_list.h 
  225. X    $(CC) $(CFLAGS) -o testlist testlist.c -lx_list 
  226. X
  227. Xlibx_hash.a: x_hash.o 
  228. X    $(ARCHIVE) libx_hash.a x_hash.o
  229. X    -ranlib libx_hash.a
  230. X
  231. Xx_hash.o: x_hash.c x_hash.h x_list.h
  232. X    $(CC) $(CFLAGS) -c x_hash.c
  233. X
  234. Xtesthash: testhash.c libx_hash.a libx_list.a x_hash.h 
  235. X    $(CC) $(CFLAGS)  -o testhash testhash.c -lx_hash -lx_list
  236. X
  237. Xclean: 
  238. X    -rm x_hash.o
  239. X    -rm libx_hash.a
  240. X    -rm x_list.o
  241. X    -rm libx_list.a
  242. X    -rm testlist.o
  243. X    -rm testlist
  244. X    -rm testhash.o
  245. X    -rm testhash
  246. X
  247. SHAR_EOF
  248. chmod 0440 src/make.unx || echo "restore of src/make.unx fails"
  249. if [ $TOUCH = can ]
  250. then
  251.     touch -am 0418223391 src/make.unx
  252. fi
  253. # ============= src/sharew.h ==============
  254. echo "x - extracting src/sharew.h (Text)"
  255. sed 's/^X//' << 'SHAR_EOF' > src/sharew.h &&
  256. X/* 
  257. X         Shareware license document : 
  258. X
  259. X     sharew.h 1.1 4/18/91
  260. X
  261. X*/
  262. X/*
  263. X
  264. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  265. X
  266. XThe author may be reached at the US MAIL address listed below, or
  267. Xby sending unix mail to ...
  268. X
  269. X           tron1@tronsbox.xei.com            or
  270. X       ...!uunet!tronsbox.xei.com!tron1  or
  271. X       yelling "Hey Ken!" if you happen to be close enough.
  272. X
  273. X
  274. XAll rights are reserved by Kenneth Jamieson.
  275. X
  276. XYou are granted permission to use this code under the following 
  277. Xrestrictions:
  278. X
  279. XNOTE: All occurrences of the word "code" below will apply to
  280. X      all files, text, program source code and documentation.
  281. X
  282. X1) This code cannot be used in any program that is to be distributed 
  283. X   to anyone other than that program's author without the
  284. X   written permission of Kenneth Jamieson. This permission will be granted 
  285. X   under the terms of registration listed below.
  286. X
  287. X2) This code may be used for a trial period of thirty (30) days.
  288. X   At that time, you mus either register the code as below or
  289. X   discontinue it's use.
  290. X   
  291. X3) UNDER NO CIRCUMSTANCES may this code (registered or not) be used or 
  292. X   distributed in any way that will prevent it's future distribution 
  293. X   under the terms of this license.
  294. X
  295. X   This specifically includes (but is not limited to) any code that
  296. X   is to be distributed under the terms of the Free Software 
  297. X   Foundation's General Public License.
  298. X
  299. X4) Kenneth Jamieson reserves all rights to this code.
  300. X
  301. X5) NO WARRANTY is given or implied as to the usefulness or correctness of 
  302. X   this code for any purpose at all, whether this code is registered or not.
  303. X
  304. X
  305. XREGISTRATION:
  306. X
  307. X   You are encouraged to register this code no matter what you use it for,
  308. X   but you MUST register this code if you need written permission under
  309. X   the terms above for distribution or intend to use it after the
  310. X   trial period expires.
  311. X
  312. X   In order to register this code, just send $15 US to the author at the
  313. X   address listed below. 
  314. X
  315. X   Kenneth Jamieson
  316. X   P.o. Box 387 
  317. X   Kearny NJ 07023
  318. X   USA
  319. X   
  320. X   Once registered you will receive permission to use this code in your own
  321. X   programs under the following restrictions:
  322. X
  323. X   1) Your program or documentation must mention that this code is in use,
  324. X      and provide your user with information about where to obtain this
  325. X      code. This information must be provided as part of the initial
  326. X      cost (if any) of your software.
  327. X
  328. X   2) If you distribute the source to your program, then the source 
  329. X      for this code must accompany your code complete and unaltered.
  330. X
  331. X   3) UNDER NO CIRCUMSTANCES may this code (registered or not) be used or 
  332. X      distributed in any way that will prevent it's future distribution 
  333. X      under the terms of this license except by Kenneth Jamieson.
  334. X
  335. X      This specifically includes (but is not limited to) any code that
  336. X      is to be distributed under the terms of the Free Software 
  337. X      Foundation's General Public License.
  338. X
  339. X   4) Kenneth Jamieson reserves all rights to this code.
  340. X
  341. X   5) NO WARRANTY is given or implied as to the usefulness or correctness of 
  342. X      this code for any purpose at all, whether this code is registered or not.
  343. X
  344. X   In addition, you will get a list of any known bugs and work-arounds,
  345. X   notice of the next update (if any), and at least one "thank you".
  346. X
  347. X
  348. X
  349. X-----------------------------------------------------
  350. X* UNIX is a trademark of AT&T
  351. X* Amiga is a trademark of Commodore Business Machines
  352. X* MS-DOS is a trademark of Microsoft Inc 
  353. X
  354. X*/
  355. SHAR_EOF
  356. chmod 0440 src/sharew.h || echo "restore of src/sharew.h fails"
  357. if [ $TOUCH = can ]
  358. then
  359.     touch -am 0418223391 src/sharew.h
  360. fi
  361. # ============= src/testhash.c ==============
  362. echo "x - extracting src/testhash.c (Text)"
  363. sed 's/^X//' << 'SHAR_EOF' > src/testhash.c &&
  364. X/* 
  365. X
  366. X   Hash table test file : 
  367. X
  368. X          testhash.c 1.2 4/18/91  
  369. X
  370. X*/
  371. X
  372. X/*
  373. X
  374. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  375. X
  376. XThe author may be reached at the US MAIL address listed below, or
  377. Xby sending unix mail to ...
  378. X
  379. X           tron1@tronsbox.xei.com            or
  380. X       ...!uunet!tronsbox.xei.com!tron1  or
  381. X       yelling "Hey Ken!" if you happen to be close enough.
  382. X
  383. X
  384. X       SEE THE FILE "sharew.h" for details before you
  385. X       use this code !!!
  386. X
  387. X*/
  388. X
  389. X#include <copyr.h>
  390. X#include <x_hash.h>
  391. X#include <stdio.h>
  392. X#include <stdlib.h>
  393. X#include <string.h>
  394. X
  395. X/* Not C++ -- so test the regular C functions */
  396. X
  397. X#define INITIAL 20
  398. X#define BIGGER 100
  399. X
  400. X#ifndef __cplusplus
  401. X
  402. Xint main(){
  403. X  struct x_hash * test_xhash;
  404. X  int loop;
  405. X  int test;
  406. X  int * foo;
  407. X  char * testchar;
  408. X
  409. X  printf("\ntestit - a testing program for the x_hash list\n");
  410. X  printf("         manager.  testhash.c 1.2 4/18/91  \n\n");
  411. X
  412. X  test_xhash = init_xhash( INITIAL );
  413. X  if( test_xhash == NULL ){
  414. X    printf("ERROR! Cannot init_xhash of size %d.\n", INITIAL); 
  415. X    return( 0 );
  416. X  }else{
  417. X    printf("Ok.... Hash table initialized. \n");
  418. X  }
  419. X
  420. X  if( hashsize( test_xhash ) != INITIAL ){
  421. X    printf("ERROR! Cannot hashsize error! Should be %d.\n", INITIAL); 
  422. X    return( 0 );
  423. X  }else{
  424. X    printf("Ok.... Hash table size correct. \n");
  425. X  }
  426. X
  427. X  if( put_xhash( test_xhash, hashkey("Key1"), (void*)"Key1",
  428. X        HASH_REPLACE) != TRUE )
  429. X  {
  430. X    printf(" ERROR! Cannot store Key1 !\n");
  431. X    return( 0 );
  432. X  }else{
  433. X    printf("Ok.... Key1 stored in the hash table. \n");
  434. X  }
  435. X
  436. X  if( put_xhash( test_xhash, hashkey("Key2"), (void*)"Key2",
  437. X        HASH_REPLACE) != TRUE )
  438. X  {
  439. X    printf(" ERROR! Cannot store Key2 !\n");
  440. X    return( 0 );
  441. X  }else{
  442. X    printf("Ok.... Key2 stored in the hash table. \n");
  443. X  }
  444. X
  445. X  if( put_xhash( test_xhash, hashkey("Key3"), (void*)"Key3",
  446. X        HASH_REPLACE) != TRUE )
  447. X  {
  448. X    printf(" ERROR! Cannot store Key3 !\n");
  449. X    return( 0 );
  450. X  }else{
  451. X    printf("Ok.... Key3 stored in the hash table. \n");
  452. X  }
  453. X
  454. X  if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4",
  455. X        HASH_REPLACE) != TRUE )
  456. X  {
  457. X    printf(" ERROR! Cannot store Key4 !\n");
  458. X    return( 0 );
  459. X  }else{
  460. X    printf("Ok.... Key4 stored in the hash table. \n");
  461. X  }
  462. X
  463. X  if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4-2",
  464. X        HASH_NOREPLACE) != TRUE )
  465. X  {
  466. X    printf(" ERROR! Cannot use HASH_NOREPLACE !\n");
  467. X    return( 0 ); 
  468. X  }else{
  469. X    printf("Ok.... Replacement prevention works. \n");
  470. X  }
  471. X
  472. X  if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4",
  473. X        HASH_REPLACE) != TRUE )
  474. X  {
  475. X    printf(" ERROR! Cannot replace keys !\n");
  476. X    return( 0 );
  477. X  }else{
  478. X    printf("Ok.... Replacement of keys works. \n");
  479. X  }
  480. X
  481. X  if( put_xhash( test_xhash, hashkey("zzz"), (void*)"zzz",
  482. X        HASH_NOADD) != FALSE )
  483. X  {
  484. X    printf(" ERROR! Cannot use HASH_NOADD !\n");
  485. X    return( 0 );
  486. X  }else{
  487. X    printf("Ok.... Replace only mode works. \n");
  488. X  }
  489. X
  490. X  if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4",
  491. X        HASH_NODUP) != FALSE )
  492. X  {
  493. X    printf(" ERROR! Cannot prevent key duplicates !\n");
  494. X    return( 0 );
  495. X  }else{
  496. X    printf("Ok.... Duplicate key prevention works. \n");
  497. X  }
  498. X
  499. X  testchar = (char * )get_xhash( test_xhash, hashkey("Key4"), HASH_GET );
  500. X  if( testchar == NULL ){
  501. X    printf("ERROR: get_xhash failed with the HASH_GET flag!\n");
  502. X    return( 0 );
  503. X  }else{
  504. X    test = strcmp( "Key4", testchar );
  505. X    if( test == 0 ){
  506. X      printf("Ok.... Getting data from hash table works fine.\n");
  507. X    }else{
  508. X      printf("ERROR: get_xhash returned \"%s\" should have been \"Key4\" !\n");
  509. X      return( 0 );
  510. X    }
  511. X  }
  512. X
  513. X  testchar = (char * )get_xhash( test_xhash, hashkey("Key4"),
  514. X                HASH_GET_NEXT );
  515. X  if( testchar == NULL ){
  516. X    printf("ERROR: get_xhash failed with the HASH_GET_NEXT flag!\n");
  517. X    return( 0 );
  518. X  }else{
  519. X    test = strcmp( "Key4-2", testchar );
  520. X    if( test == 0 ){
  521. X      printf("Ok.... Getting secondary data from hash table works fine.\n");
  522. X    }else{
  523. X      printf(
  524. X      "ERROR: get_xhash returned \"%s\" should have been \"Key4-2\" !\n");
  525. X      return( 0 );
  526. X    }
  527. X  }
  528. X
  529. X  if( del_xhash( test_xhash, hashkey("Key3"),HASH_DELETE) != TRUE ){
  530. X    printf(" ERROR! Cannot delete keys !\n");
  531. X    return( 0 );
  532. X  }else{
  533. X    testchar = (char * )get_xhash( test_xhash, hashkey("Key3"),
  534. X                HASH_GET_NEXT );
  535. X    if(testchar != NULL){
  536. X      printf(" ERROR! Cannot delete keys !\n");
  537. X      return( 0 );
  538. X    }
  539. X    printf("Ok.... Deletion of keys works. \n");
  540. X  }
  541. X
  542. X  if( del_xhash( test_xhash, hashkey("Key4"), HASH_DELETE_ALL) == FALSE ){
  543. X    printf(" ERROR! Cannot delete multiple keys !\n");
  544. X    return( 0 );
  545. X  }else{
  546. X    testchar = (char * )get_xhash( test_xhash, hashkey("Key4"),
  547. X                HASH_GET );
  548. X    if(testchar != NULL){
  549. X      printf(" ERROR! Cannot delete multiple keys on read! %s\n", testchar);
  550. X      return( 0 );
  551. X    }
  552. X    printf("Ok.... Deletion of multiple keys works. \n");
  553. X  }
  554. X
  555. X
  556. X}
  557. X
  558. X#endif
  559. X  
  560. X#ifdef __cplusplus
  561. X
  562. Xint main(){
  563. X  X_Hash *test_xhash;
  564. X  int test;
  565. X  char * testchar;
  566. X
  567. X  printf("\ntesthash - a testing program for the x_hash list\n");
  568. X  printf("         manager. testhash.c 1.2 4/18/91  \n\n");
  569. X  printf("         TESTING C++ INTERFACE\n\n");
  570. X
  571. X  test_xhash = new X_Hash( INITIAL );
  572. X  if( test_xhash == NULL ){
  573. X    printf("ERROR! Cannot construct a hash of size %d.\n", INITIAL); 
  574. X    return( 0 );
  575. X  }else{
  576. X    printf("Ok.... Hash table initialized. \n");
  577. X  }
  578. X
  579. X  if( test_xhash->size() != INITIAL ){
  580. X    printf("ERROR! Cannot hashsize error! Should be %d.\n", INITIAL); 
  581. X    return( 0 );
  582. X  }else{
  583. X    printf("Ok.... Hash table size correct. \n");
  584. X  }
  585. X
  586. X  if( test_xhash->put( hashkey("Key1"), (void*)"Key1",
  587. X        HASH_REPLACE) != TRUE )
  588. X  {
  589. X    printf(" ERROR! Cannot store Key1 !\n");
  590. X    return( 0 );
  591. X  }else{
  592. X    printf("Ok.... Key1 stored in the hash table. \n");
  593. X  }
  594. X
  595. X  if( test_xhash->put( hashkey("Key2"), (void*)"Key2",
  596. X        HASH_REPLACE) != TRUE )
  597. X  {
  598. X    printf(" ERROR! Cannot store Key2 !\n");
  599. X    return( 0 );
  600. X  }else{
  601. X    printf("Ok.... Key2 stored in the hash table. \n");
  602. X  }
  603. X
  604. X  if( test_xhash->put( hashkey("Key3"), (void*)"Key3",
  605. X        HASH_REPLACE) != TRUE )
  606. X  {
  607. X    printf(" ERROR! Cannot store Key3 !\n");
  608. X    return( 0 );
  609. X  }else{
  610. X    printf("Ok.... Key3 stored in the hash table. \n");
  611. X  }
  612. X
  613. X  if( test_xhash->put( hashkey("Key4"), (void*)"Key4",
  614. X        HASH_REPLACE) != TRUE )
  615. X  {
  616. X    printf(" ERROR! Cannot store Key4 !\n");
  617. X    return( 0 );
  618. X  }else{
  619. X    printf("Ok.... Key4 stored in the hash table. \n");
  620. X  }
  621. X
  622. X  if( test_xhash->put( hashkey("Key4"), (void*)"Key4-2",
  623. X        HASH_NOREPLACE) != TRUE )
  624. X  {
  625. X    printf(" ERROR! Cannot use HASH_NOREPLACE !\n");
  626. X    return( 0 ); 
  627. X  }else{
  628. X    printf("Ok.... Replacement prevention works. \n");
  629. X  }
  630. X
  631. X  if( test_xhash->put( hashkey("Key4"), (void*)"Key4",
  632. X        HASH_REPLACE) != TRUE )
  633. X  {
  634. X    printf(" ERROR! Cannot replace keys !\n");
  635. X    return( 0 );
  636. X  }else{
  637. X    printf("Ok.... Replacement of keys works. \n");
  638. X  }
  639. X
  640. X  if( test_xhash->put( hashkey("zzz"), (void*)"zzz",
  641. X        HASH_NOADD) != FALSE )
  642. X  {
  643. X    printf(" ERROR! Cannot use HASH_NOADD !\n");
  644. X    return( 0 );
  645. X  }else{
  646. X    printf("Ok.... Replace only mode works. \n");
  647. X  }
  648. X
  649. X  if( test_xhash->put( hashkey("Key4"), (void*)"Key4",
  650. X        HASH_NODUP) != FALSE )
  651. X  {
  652. X    printf(" ERROR! Cannot prevent key duplicates !\n");
  653. X    return( 0 );
  654. X  }else{
  655. X    printf("Ok.... Duplicate key prevention works. \n");
  656. X  }
  657. X
  658. X  testchar = (char * )test_xhash->get( hashkey("Key4"), HASH_GET );
  659. X  if( testchar == NULL ){
  660. X    printf("ERROR: get_xhash failed with the HASH_GET flag!\n");
  661. X    return( 0 );
  662. X  }else{
  663. X    test = strcmp( "Key4", testchar );
  664. X    if( test == 0 ){
  665. X      printf("Ok.... Getting data from hash table works fine.\n");
  666. X    }else{
  667. X      printf("ERROR: get() returned \"%s\" should have been \"Key4\" !\n");
  668. X      return( 0 );
  669. X    }
  670. X  }
  671. X
  672. X  testchar = (char * )test_xhash->get( hashkey("Key4"),    HASH_GET_NEXT );
  673. X  if( testchar == NULL ){
  674. X    printf("ERROR: get_xhash failed with the HASH_GET_NEXT flag!\n");
  675. X    return( 0 );
  676. X  }else{
  677. X    test = strcmp( "Key4-2", testchar );
  678. X    if( test == 0 ){
  679. X      printf("Ok.... Getting secondary data from hash table works fine.\n");
  680. X    }else{
  681. X      printf(
  682. X      "ERROR: get_xhash returned \"%s\" should have been \"Key4-2\" !\n");
  683. X      return( 0 );
  684. X    }
  685. X  }
  686. X
  687. X  if( test_xhash->del( hashkey("Key3"),HASH_DELETE) != TRUE ){
  688. X    printf(" ERROR! Cannot delete keys !\n");
  689. X    return( 0 );
  690. X  }else{
  691. X    testchar = (char * )test_xhash->get( hashkey("Key3"),HASH_GET_NEXT );
  692. X    if(testchar != NULL){
  693. X      printf(" ERROR! Cannot delete keys !\n");
  694. X      return( 0 );
  695. X    }
  696. X    printf("Ok.... Deletion of keys works. \n");
  697. X  }
  698. X
  699. X  if( test_xhash->del( hashkey("Key4"), HASH_DELETE_ALL) == FALSE ){
  700. X    printf(" ERROR! Cannot delete multiple keys !\n");
  701. X    return( 0 );
  702. X  }else{
  703. X    testchar = (char * )test_xhash->get( hashkey("Key4"),HASH_GET );
  704. X    if(testchar != NULL){
  705. X      printf(" ERROR! Cannot delete multiple keys on read! %s\n", testchar);
  706. X      return( 0 );
  707. X    }
  708. X    printf("Ok.... Deletion of multiple keys works. \n");
  709. X  }
  710. X
  711. X}
  712. X
  713. X#endif 
  714. X
  715. X
  716. X
  717. X
  718. X
  719. X
  720. SHAR_EOF
  721. chmod 0440 src/testhash.c || echo "restore of src/testhash.c fails"
  722. if [ $TOUCH = can ]
  723. then
  724.     touch -am 0418223391 src/testhash.c
  725. fi
  726. # ============= src/testlist.c ==============
  727. echo "x - extracting src/testlist.c (Text)"
  728. sed 's/^X//' << 'SHAR_EOF' > src/testlist.c &&
  729. X/* 
  730. X
  731. X   Doubly linked list test file : 
  732. X
  733. X    testlist.c 4/18/91 1.4
  734. X
  735. X*/
  736. X
  737. X/*
  738. X
  739. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  740. X
  741. XThe author may be reached at the US MAIL address listed below, or
  742. Xby sending unix mail to ...
  743. X
  744. X           tron1@tronsbox.xei.com            or
  745. X       ...!uunet!tronsbox.xei.com!tron1  or
  746. X       yelling "Hey Ken!" if you happen to be close enough.
  747. X
  748. X
  749. X       SEE THE FILE "sharew.h" for details before you
  750. X       use this code !!!
  751. X
  752. X*/
  753. X
  754. X#include <copyr.h>
  755. X#include <x_list.h>
  756. X#include <stdio.h>
  757. X#include <stdlib.h>
  758. X
  759. X#ifndef __cplusplus
  760. X
  761. X/* Not C++ -- so test the regular C functions */
  762. X
  763. Xint main(){
  764. X  struct x_list * test_xlist;
  765. X  int loop;
  766. X  int * foo;
  767. X
  768. X  printf("\ntestit - a testing program for the x_list list\n");
  769. X  printf("         manager. testit.c  testit.c 1.3 3/3/91 \n\n");
  770. X
  771. X
  772. X  /* Let's create the list that we will play with */
  773. X  test_xlist = init_xlist();
  774. X  if( test_xlist == NULL ){
  775. X    fprintf(stderr,"There is an error in the init_xlist() function!\n");
  776. X    return( FALSE );
  777. X  }else{
  778. X    printf("\nOk.... init_xlist() seems to be working ok!\n");
  779. X  }
  780. X
  781. X  /* Let's set the user pointer just to play with !    */
  782. X  if( set_user_xlist( test_xlist, "User data test!" ) == FALSE ){
  783. X    fprintf(stderr,"Error in the set_user_xlist() function!\n");
  784. X  }else{
  785. X    printf("Ok.... set_user_xlist() seems to be working ok!\n");
  786. X  }
  787. X
  788. X  /* Let's get the user pointer just to play with !    */
  789. X  if( get_user_xlist( test_xlist ) == NULL ){
  790. X    fprintf(stderr,"Error in the get_user_xlist() function!\n");
  791. X    return( FALSE );
  792. X  }else{
  793. X    printf("Ok.... get_user_xlist() seems to be working ok!\n");
  794. X  }
  795. X
  796. X  /* Add 100 integers to the list just for fun !    */
  797. X  for( loop = 0; loop < 100; loop++ ){
  798. X    foo = (int *)malloc( sizeof(int) );
  799. X    if( foo == NULL ){
  800. X      fprintf(stderr,"Malloc error on test insert #%d !\n", loop);
  801. X      return( FALSE );
  802. X    }
  803. X    *foo = loop;
  804. X    if( add_xlist( test_xlist, foo ) == FALSE ){
  805. X      fprintf(stderr,"add_xlist() error on test insert #%d !\n", loop);
  806. X      return( FALSE );
  807. X    }
  808. X  }
  809. X  
  810. X  /* Now .. see that the counter got set right! */
  811. X  if( get_count_xlist( test_xlist ) != 100 ){
  812. X    fprintf(stderr,"get_count_xlist() error! Said #%d, should be 100 !\n",
  813. X        get_count_xlist( test_xlist ) );
  814. X    return( FALSE );
  815. X  }else{
  816. X    printf("Ok.... get_count_xlist() seams to be working ok!\n");
  817. X  }
  818. X
  819. X  /* Now, reset the list to the end ! */
  820. X  if( tail_xlist( test_xlist ) == FALSE ){
  821. X    fprintf(stderr,"tail_xlist() error !\n", loop);
  822. X    return( FALSE );
  823. X  }else{
  824. X    printf("Ok.... tail_xlist() seems to be working!\n");
  825. X  }
  826. X
  827. X  /* Now, reset the list to the top ! */
  828. X  if( head_xlist( test_xlist ) == FALSE ){
  829. X    fprintf(stderr,"head_xlist() error !\n", loop);
  830. X    return( FALSE );
  831. X  }else{
  832. X    printf("Ok.... head_xlist() seems to be working!\n");
  833. X  }
  834. X
  835. X  /* Now, let's retrieve all that data and make sure that it is right ! */
  836. X  for( loop = 0; loop < 100; loop++ ){
  837. X    foo = (int *)get_xlist( test_xlist ); 
  838. X    if( foo == NULL ){
  839. X      fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop);
  840. X      return( FALSE );
  841. X    }
  842. X    if( *foo != loop ){
  843. X      fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop);
  844. X      return( FALSE );
  845. X    }
  846. X    if( get_nodenum_xlist( test_xlist ) != loop ){
  847. X      fprintf(stderr,
  848. X          "get_nodenum_xlist() error on test retrieve #%d !\n", loop);
  849. X    }
  850. X    if( next_xlist( test_xlist ) == FALSE && loop != 99 ){
  851. X      fprintf(stderr,"next_xlist() error on test retrieve #%d !\n", loop);
  852. X      return( FALSE );
  853. X    }
  854. X  }
  855. X  
  856. X  printf("Ok.... 100 retrieves went ok, next_xlist() is working fine !\n");
  857. X
  858. X  /* Now, let's retrieve all that data and make sure that it is right ! */
  859. X  for( loop = 99; loop > -1; loop-- ){
  860. X    foo = (int *)get_xlist( test_xlist ); 
  861. X    if( foo == NULL ){
  862. X      fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop);
  863. X      return( FALSE );
  864. X    }
  865. X    if( *foo != loop ){
  866. X      fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop);
  867. X      return( FALSE );
  868. X    }
  869. X    if( get_nodenum_xlist( test_xlist ) != loop ){
  870. X      fprintf(stderr,
  871. X          "get_nodenum_xlist() error on test retrieve #%d !\n", loop);
  872. X    }
  873. X    if( prev_xlist( test_xlist ) == FALSE && loop != 0 ){
  874. X      fprintf(stderr,"prev_xlist() error on test retrieve #%d !\n", loop);
  875. X      return( FALSE );
  876. X    }
  877. X  }
  878. X  
  879. X  printf("Ok.... 100 retrieves went ok, prev_xlist() is working fine !\n");
  880. X
  881. X  if( goto_xlist( test_xlist, 50 ) == FALSE ){
  882. X      fprintf(stderr,"goto_xlist() error  !\n");
  883. X      return( FALSE );    
  884. X  }
  885. X  foo = (int *)get_xlist( test_xlist ); 
  886. X  if( foo == NULL ){
  887. X    fprintf(stderr,
  888. X        "get_xlist() error on retrieve for goto_xlist() !\n");
  889. X    return( FALSE );
  890. X  }
  891. X  if( *foo != 50 ){
  892. X    fprintf(stderr,
  893. X        "get_xlist() error on retrieve for goto_xlist() !\n");
  894. X    return( FALSE );
  895. X  }  
  896. X  printf("Ok.... goto_xlist() seems to be working fine !\n");
  897. X
  898. X  if( get_nodenum_xlist( test_xlist ) != 50 ){
  899. X    fprintf(stderr,
  900. X        "get_nodenum_xlist() error (does not match)! \n");
  901. X    return( FALSE );
  902. X  }
  903. X  printf("Ok.... get_nodenum_xlist() seems to be working ok! \n");
  904. X
  905. X
  906. X  if( free_xlist( test_xlist ) == FALSE ){
  907. X    fprintf(stderr,"free_xlist() error !!! \n");
  908. X    return( FALSE );
  909. X  }else{
  910. X    printf("Ok.... free_xlist() seems to be working! \n");
  911. X  }
  912. X
  913. X  printf("\nAll tests passed ! Congratulations !\n\n");
  914. X  return( TRUE );
  915. X}
  916. X
  917. X#endif
  918. X
  919. X#ifdef __cplusplus
  920. X
  921. X/*  C++ -- so test the C++ functions */
  922. X
  923. Xint main(){
  924. X  X_List test_xlist;
  925. X  int loop;
  926. X  int * foo;
  927. X
  928. X  printf("\ntestit - a testing program for the x_list list\n");
  929. X  printf("         manager (C++ version). testit.c testit.c 1.3 3/3/91\n\n");
  930. X
  931. X  /* Let's set the user pointer just to play with !    */
  932. X  if( test_xlist.set_user( "User data test!" ) == FALSE ){
  933. X    fprintf(stderr,"Error in the X_List.set_user() function!\n");
  934. X  }else{
  935. X    printf("Ok.... X_List.set_user() seems to be working ok!\n");
  936. X  }
  937. X
  938. X  /* Let's get the user pointer just to play with !    */
  939. X  if( test_xlist.get_user() == NULL ){
  940. X    fprintf(stderr,"Error in the X_List.get_user() function!\n");
  941. X    return( FALSE );
  942. X  }else{
  943. X    printf("Ok.... X_List.get_user() seems to be working ok!\n");
  944. X  }
  945. X
  946. X  /* Add 100 integers to the list just for fun !    */
  947. X  for( loop = 0; loop < 100; loop++ ){
  948. X    foo = (int *)malloc( sizeof(int) );
  949. X    if( foo == NULL ){
  950. X      fprintf(stderr,"Malloc error on test insert #%d !\n", loop);
  951. X      return( FALSE );
  952. X    }
  953. X    *foo = loop;
  954. X    if( test_xlist.add( foo ) == FALSE ){
  955. X      fprintf(stderr,"X_List.add() error on test insert #%d !\n", loop);
  956. X      return( FALSE );
  957. X    }
  958. X  }
  959. X  
  960. X  /* Now .. see that the counter got set right! */
  961. X  if( test_xlist.count() != 100 ){
  962. X    fprintf(stderr,"X_List.count() error! Said #%d, should be 100 !\n",
  963. X        test_xlist.count() );
  964. X    return( FALSE );
  965. X  }else{
  966. X    printf("Ok.... X_List.count() seams to be working ok!\n");
  967. X  }
  968. X
  969. X  /* Now, reset the list to the top ! */
  970. X  if( test_xlist.head() == FALSE ){
  971. X    fprintf(stderr,"X_List.head() error !\n", loop);
  972. X    return( FALSE );
  973. X  }else{
  974. X    printf("Ok.... X_List.head() seems to be working!\n");
  975. X  }
  976. X
  977. X  /* Now, let's retrieve all that data and make sure that it is right ! */
  978. X  for( loop = 0; loop < 100; loop++ ){
  979. X    foo = (int *)test_xlist.get(); 
  980. X    if( foo == NULL ){
  981. X      fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop);
  982. X      return( FALSE );
  983. X    }
  984. X    if( *foo != loop ){
  985. X      fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop);
  986. X      return( FALSE );
  987. X    }
  988. X    if( test_xlist.next() == FALSE && loop != 99 ){
  989. X      fprintf(stderr,"X_List.next() error on test retrieve #%d !\n", loop);
  990. X      return( FALSE );
  991. X    }
  992. X  }
  993. X  
  994. X  printf("Ok.... 100 retrieves went ok, X_List.next() is working fine !\n");
  995. X
  996. X  /* Now, let's retrieve all that data and make sure that it is right ! */
  997. X  for( loop = 99; loop > -1; loop-- ){
  998. X    foo = (int *)test_xlist.get(); 
  999. X    if( foo == NULL ){
  1000. X      fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop);
  1001. X      return( FALSE );
  1002. X    }
  1003. X    if( *foo != loop ){
  1004. X      fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop);
  1005. X      return( FALSE );
  1006. X    }
  1007. X    if( test_xlist.prev() == FALSE && loop != 0 ){
  1008. X      fprintf(stderr,"X_List.prev() error on test retrieve #%d !\n", loop);
  1009. X      return( FALSE );
  1010. X    }
  1011. X  }
  1012. X  
  1013. X  printf("Ok.... 100 retrieves went ok, X_List.prev() is working fine !\n");
  1014. X
  1015. X  /* Now, let's retrieve it with the [] operator ! */
  1016. X  for( loop = 99; loop > -1; loop-- ){
  1017. X    foo = (int *)test_xlist[loop]; 
  1018. X    if( foo == NULL ){
  1019. X      fprintf(stderr,"X_List operator [] error on #%d !\n", loop);
  1020. X      return( FALSE );
  1021. X    }
  1022. X    if( *foo != loop ){
  1023. X      fprintf(stderr,"X_List operator [] error on #%d !\n", loop);
  1024. X      return( FALSE );
  1025. X    }
  1026. X    if( test_xlist.nodenum() != loop ){
  1027. X      fprintf(stderr,"X_List.nodenum() error on #%d!\n", loop);
  1028. X    }
  1029. X  }
  1030. X  printf("Ok.... X_List.goto_node() seems to work ok!\n");
  1031. X  printf("Ok.... X_List.nodenum() seems to work ok!\n");
  1032. X  printf("Ok.... the operator [] seems to work ok!\n");
  1033. X  
  1034. X  printf("\nAll tests passed ! Congratulations !\n\n");
  1035. X  return( TRUE );
  1036. X}
  1037. X
  1038. X#endif
  1039. X
  1040. X
  1041. SHAR_EOF
  1042. chmod 0440 src/testlist.c || echo "restore of src/testlist.c fails"
  1043. if [ $TOUCH = can ]
  1044. then
  1045.     touch -am 0418223391 src/testlist.c
  1046. fi
  1047. # ============= src/x_hash.c ==============
  1048. echo "x - extracting src/x_hash.c (Text)"
  1049. sed 's/^X//' << 'SHAR_EOF' > src/x_hash.c &&
  1050. X/* 
  1051. X
  1052. X   Hash table function file : 
  1053. X
  1054. X         x_hash.c 1.1 4/18/91 
  1055. X
  1056. X*/
  1057. X
  1058. X/*
  1059. X
  1060. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  1061. X
  1062. XThe author may be reached at the US MAIL address listed below, or
  1063. Xby sending unix mail to ...
  1064. X
  1065. X           tron1@tronsbox.xei.com            or
  1066. X       ...!uunet!tronsbox.xei.com!tron1  or
  1067. X       yelling "Hey Ken!" if you happen to be close enough.
  1068. X
  1069. X
  1070. X       SEE THE FILE "sharew.h" for details before you
  1071. X       use this code !!!
  1072. X
  1073. X*/
  1074. X
  1075. X
  1076. X#include <string.h>
  1077. X#include <malloc.h>
  1078. X#include <memory.h>
  1079. X#include <x_hash.h>
  1080. X
  1081. Xlong hashkey( char * key ){
  1082. X  long hash = 0;
  1083. X  long i = 0;
  1084. X  long slen = 0;
  1085. X
  1086. X  slen = strlen( key );
  1087. X
  1088. X  if( key == NULL || slen == 0 ){
  1089. X    return( (long)NULL );
  1090. X  }
  1091. X
  1092. X  for( i = 0; i < slen; i++ ){
  1093. X    hash = hash - (int)*(key+i);
  1094. X    hash = hash << 1;
  1095. X  }
  1096. X  if( hash < 0 ){
  1097. X    hash = hash * -1;
  1098. X  }
  1099. X  return( hash );
  1100. X}
  1101. X    
  1102. Xlong indexhash( long key, long range ){
  1103. X  long index;
  1104. X
  1105. X  if( key == 0 || range == 0 ){
  1106. X    return( NULL );
  1107. X  }
  1108. X  index = key % range;
  1109. X  return( index );
  1110. X}
  1111. X
  1112. Xlong hashsize( struct x_hash * table ){
  1113. X  if( table == NULL ){
  1114. X    return( FALSE );
  1115. X  }
  1116. X  return( table->table_size );
  1117. X}
  1118. X
  1119. Xstruct x_hash * init_xhash( long initial_size ){
  1120. X  struct x_hash * tmp1;
  1121. X  struct x_list ** tmp2;
  1122. X  int loop;
  1123. X
  1124. X  tmp1 = (struct x_hash *)malloc( sizeof( struct x_hash ) );
  1125. X  if( tmp1 == NULL ){
  1126. X    return( NULL );
  1127. X  }
  1128. X
  1129. X  tmp2 = (struct x_list **)malloc( (unsigned int)initial_size*sizeof(struct x_list *) );
  1130. X  if( tmp2 == NULL ){
  1131. X    return( NULL );
  1132. X  }
  1133. X
  1134. X  for( loop = 0; loop < initial_size; loop ++){
  1135. X    tmp2[loop] = init_xlist();
  1136. X  }
  1137. X  tmp1->table_size = initial_size;
  1138. X  tmp1->table_pointer = tmp2;
  1139. X  tmp1->additions = 0;
  1140. X  tmp1->collisions = 0;
  1141. X  tmp1->replaces = 0;
  1142. X  
  1143. X  return( tmp1 );
  1144. X}
  1145. X
  1146. Xstruct x_hash_entry * init_xhash_entry(){
  1147. X  struct x_hash_entry * foo;
  1148. X  foo = (struct x_hash_entry *)malloc( sizeof(struct x_hash_entry) );
  1149. X  foo->key_value = 0;
  1150. X  foo->data = NULL;
  1151. X  return( foo );
  1152. X}
  1153. X
  1154. Xint put_xhash( struct x_hash * table, long key, void * data, int hash_flag ){
  1155. X  struct x_hash_entry *entry;
  1156. X  struct x_hash_entry *buffer;
  1157. X  long foo;
  1158. X  long subscript;
  1159. X
  1160. X  if( table == NULL ){
  1161. X    return( FALSE );
  1162. X  }
  1163. X
  1164. X  entry = init_xhash_entry();
  1165. X  if( entry == NULL ){
  1166. X    return( FALSE );
  1167. X  }
  1168. X  entry->key_value = key;
  1169. X                         /* Set key value of new data    */
  1170. X  entry->data = data;        
  1171. X                         /* Set data pointer to data    */
  1172. X
  1173. X  subscript = indexhash( key, table->table_size );
  1174. X
  1175. X  switch( hash_flag ){
  1176. X    case HASH_NOREPLACE:  return( 
  1177. X                 add_xlist( table->table_pointer[subscript], 
  1178. X                       (void *)entry ) 
  1179. X                 );
  1180. X                          break;
  1181. X
  1182. X    case HASH_REPLACE:    head_xlist( table->table_pointer[subscript] );
  1183. X                          buffer = (struct x_hash_entry *)
  1184. X                get_xlist( table->table_pointer[subscript] );
  1185. X                          while( 1 ){
  1186. X                if( buffer == NULL ){
  1187. X                      /* No table entries ! add it */
  1188. X                  return( add_xlist( 
  1189. X                    table->table_pointer[subscript], 
  1190. X                        (void *)entry ) );
  1191. X                }
  1192. X                if( buffer->key_value == entry->key_value ){
  1193. X                  /* Replace it !!!            */
  1194. X                  return( put_xlist( 
  1195. X                    table->table_pointer[subscript], 
  1196. X                        (void *)entry ) );
  1197. X                }
  1198. X                foo = next_xlist(table->table_pointer[subscript] );
  1199. X                if( foo == FALSE ){
  1200. X                      /* End of list!   */
  1201. X                  return(add_xlist(table->table_pointer[subscript],
  1202. X                           (void *)entry ) );
  1203. X                }
  1204. X              }
  1205. X                          break;
  1206. X
  1207. X    case HASH_NODUP:    head_xlist( table->table_pointer[subscript] );
  1208. X                          buffer = 
  1209. X                (struct x_hash_entry *)
  1210. X                  get_xlist( table->table_pointer[subscript] );
  1211. X                          while( 1 ){
  1212. X                if( buffer == NULL ){
  1213. X                      /* No table entries ! add it */
  1214. X                  return(add_xlist(table->table_pointer[subscript],
  1215. X                           (void *)entry ) );
  1216. X                }
  1217. X                if( buffer->key_value == entry->key_value ){
  1218. X                  /* Replace it !!!            */
  1219. X                  return( FALSE );
  1220. X                }
  1221. X                foo = next_xlist(table->table_pointer[subscript] );
  1222. X                if( foo == FALSE ){
  1223. X                      /* End of list!   */
  1224. X                  return(add_xlist(table->table_pointer[subscript],
  1225. X                           (void *)entry ) );
  1226. X                }
  1227. X              }
  1228. X                          break;
  1229. X
  1230. X    case HASH_NOADD:    head_xlist( table->table_pointer[subscript] );
  1231. X                          buffer = (struct x_hash_entry *)
  1232. X                get_xlist( table->table_pointer[subscript] );
  1233. X                          while( 1 ){
  1234. X                if( buffer == NULL ){
  1235. X                      /* No table entries ! add it */
  1236. X                  return( FALSE );
  1237. X                }
  1238. X                if( buffer->key_value == entry->key_value ){
  1239. X                  /* Replace it !!!            */
  1240. X                  return(put_xlist(table->table_pointer[subscript],
  1241. X                           (void *)entry ) );
  1242. X                }
  1243. X                foo = next_xlist(table->table_pointer[subscript] );
  1244. X                if( foo == FALSE ){
  1245. X                  /* End of list!   */
  1246. X                  return( FALSE );
  1247. X                }
  1248. X              }
  1249. X                          break;
  1250. X
  1251. X    default:        return( FALSE );
  1252. X                        break;
  1253. X    }
  1254. X
  1255. X}
  1256. X
  1257. Xvoid * get_xhash( struct x_hash * table, long key, int hash_flag ){
  1258. X  struct x_hash_entry *buffer;
  1259. X  long foo;
  1260. X  long subscript;
  1261. X
  1262. X  if( table == NULL ){
  1263. X    return( NULL );
  1264. X  }
  1265. X
  1266. X  subscript = indexhash( key, table->table_size );
  1267. X
  1268. X  switch( hash_flag ){
  1269. X    case HASH_GET:    head_xlist( table->table_pointer[subscript] );
  1270. X                          buffer = (struct x_hash_entry *)
  1271. X                get_xlist( table->table_pointer[subscript] );
  1272. X                          while( 1 ){
  1273. X                if( buffer == NULL ){
  1274. X                      /* No table entries ! */
  1275. X                  return( NULL );
  1276. X                }
  1277. X                if( buffer->key_value == key ){
  1278. X                  /* Return  it !!!     */
  1279. X                  return( buffer->data );
  1280. X                }
  1281. X                foo = next_xlist(table->table_pointer[subscript] );
  1282. X                if( foo == FALSE ){    
  1283. X                  /* End of list!   */
  1284. X                  return( NULL );
  1285. X                }
  1286. X              }
  1287. X                          break;
  1288. X
  1289. X    case HASH_GET_NEXT:      /*NOTICE: We do NOT reset the list this time !!!!! */
  1290. X              foo = next_xlist( table->table_pointer[subscript] );
  1291. X                          while( 1 ){
  1292. X                if( foo == FALSE ){
  1293. X                      /* End of list!   */
  1294. X                  return( NULL );
  1295. X                }
  1296. X                            buffer = (struct x_hash_entry *)
  1297. X                  get_xlist( table->table_pointer[subscript] );
  1298. X                if( buffer == NULL ){
  1299. X                      /* No table entries ! */
  1300. X                  return( NULL );
  1301. X                }
  1302. X                if( buffer->key_value == key ){
  1303. X                  /* Return  it !!!     */
  1304. X                  return( buffer->data );
  1305. X                }
  1306. X                foo = next_xlist(table->table_pointer[subscript] );
  1307. X              }
  1308. X                          break;
  1309. X
  1310. X    default:        return( NULL );
  1311. X                        break;
  1312. X    }
  1313. X
  1314. X}
  1315. X
  1316. Xstruct x_hash * resize_xhash( struct x_hash * table, long new_size ){
  1317. X  struct x_hash * new_table;
  1318. X  struct x_hash_entry * buffer;
  1319. X  long loop;
  1320. X
  1321. X  new_table = init_xhash( new_size );
  1322. X  if( new_table == NULL ){
  1323. X    return( NULL );
  1324. X  }
  1325. X  for( loop = 0; loop < table->table_size ; loop++ ){
  1326. X    if( head_xlist( table->table_pointer[loop] ) != FALSE ){
  1327. X      buffer = (struct x_hash_entry *)get_xlist( table->table_pointer[loop] );
  1328. X      if( buffer == NULL ){    /* Should never happen! */
  1329. X    return( NULL );
  1330. X      }
  1331. X      if( put_xhash(new_table,buffer->key_value, 
  1332. X            buffer->data, HASH_NOREPLACE ) == FALSE ){
  1333. X    return( NULL );
  1334. X      }
  1335. X      while( next_xlist( table->table_pointer[loop] ) == TRUE ){
  1336. X    buffer = (struct x_hash_entry *)get_xlist(table->table_pointer[loop]);
  1337. X    if( buffer == NULL ){
  1338. X      return( NULL );
  1339. X    }      
  1340. X    if( put_xhash( new_table, buffer->key_value, 
  1341. X              buffer->data, HASH_NOREPLACE ) == FALSE ){
  1342. X      return( NULL );
  1343. X    }      
  1344. X      }
  1345. X    }  /* If reset_xhash != FALSE .. this list has at least one entry */
  1346. X  }
  1347. X  return( new_table );
  1348. X}
  1349. X
  1350. Xint del_xhash( struct x_hash * table, long key, int hash_flag ){
  1351. X  int retval;
  1352. X  struct x_hash_entry *buffer;
  1353. X  long foo;
  1354. X  long subscript;
  1355. X
  1356. X  retval = FALSE;
  1357. X  if( table == NULL ){
  1358. X    return( FALSE );
  1359. X  }
  1360. X  subscript = indexhash( key, table->table_size );
  1361. X  switch( hash_flag ){
  1362. X    case HASH_DELETE:    head_xlist( table->table_pointer[subscript] );
  1363. X                          buffer = (struct x_hash_entry *)
  1364. X                get_xlist( table->table_pointer[subscript] );
  1365. X                          while( 1 ){
  1366. X                if( buffer == NULL ){
  1367. X                      /* No table entries ! */
  1368. X                  return( FALSE );
  1369. X                }
  1370. X                if( buffer->key_value == key ){
  1371. X                  /* Delete  it !!!     */
  1372. X                  return( 
  1373. X                     del_xlist(table->table_pointer[subscript])
  1374. X                     );
  1375. X                }
  1376. X                foo = next_xlist(table->table_pointer[subscript] );
  1377. X                if( foo == FALSE ){    
  1378. X                  /* End of list!   */
  1379. X                  return( FALSE );
  1380. X                }
  1381. X              }
  1382. X                          break;
  1383. X    case HASH_DELETE_ALL:  
  1384. X                          while( del_xhash( table, key, HASH_DELETE )
  1385. X                == TRUE ){
  1386. X                retval++;
  1387. X              }
  1388. X                          return( retval );
  1389. X                          break;
  1390. X    default:    return( FALSE );
  1391. X                break;
  1392. X    }
  1393. X}
  1394. X
  1395. Xint set_user_xhash( struct x_hash * table, void * user_data){
  1396. X  if( table == NULL ){
  1397. X    return( NULL );
  1398. X  }
  1399. X  table->user = user_data;
  1400. X  return(TRUE);
  1401. X}
  1402. X
  1403. Xvoid *get_user_xhash( struct x_hash * table ){
  1404. X  if( table == NULL ){
  1405. X    return( NULL );
  1406. X  }
  1407. X  return( table->user );
  1408. X}
  1409. X
  1410. X#ifdef __cplusplus
  1411. X
  1412. XX_Hash::X_Hash( long isize ){
  1413. X  hash = init_xhash( isize );
  1414. X}
  1415. X
  1416. XX_Hash::X_Hash( void * name, long isize ){
  1417. X  hash = init_xhash( isize );
  1418. X  if( hash != NULL ){
  1419. X    set_user_xhash( hash, name );
  1420. X  }
  1421. X}
  1422. X
  1423. Xlong X_Hash::size(){
  1424. X  if( hash != NULL ){
  1425. X     return( hashsize( hash ) );
  1426. X  }
  1427. X  return( NULL );
  1428. X}
  1429. X
  1430. Xint X_Hash::resize( long new_size ){
  1431. X  if( hash != NULL ){
  1432. X    hash = resize_xhash( hash, new_size );
  1433. X    if( hash != NULL ){
  1434. X      return( TRUE );
  1435. X    }
  1436. X  }
  1437. X  return( FALSE );
  1438. X}
  1439. X
  1440. Xvoid * X_Hash::get( long key, int hash_flag ){
  1441. X  if( hash != NULL ){
  1442. X    return( get_xhash( hash, key, hash_flag ) );
  1443. X  }
  1444. X  return( NULL );
  1445. X}
  1446. X
  1447. Xint X_Hash::put(  long key, void * new_data, int hash_flag ){
  1448. X  if( hash != NULL ){
  1449. X    return( put_xhash( hash, key, new_data, hash_flag ) );
  1450. X  }
  1451. X  return( FALSE );
  1452. X}
  1453. X
  1454. Xint X_Hash::del( long key, int hash_flag ){
  1455. X  if( hash != NULL ){
  1456. X    return( del_xhash( hash, key, hash_flag ) );
  1457. X  }
  1458. X    return( FALSE );
  1459. X}
  1460. X
  1461. Xint X_Hash::set_user( void * user_data ){
  1462. X  if( hash != NULL ){
  1463. X    return( set_user_xhash( hash, user_data ) );
  1464. X  }
  1465. X  return( FALSE );
  1466. X}
  1467. X
  1468. Xvoid *X_Hash::get_user(){
  1469. X  if( hash != NULL ){
  1470. X    return( get_user_xhash( hash ) );
  1471. X  }
  1472. X  return( FALSE );
  1473. X}
  1474. X
  1475. X#endif
  1476. X
  1477. X
  1478. X
  1479. X
  1480. X
  1481. X
  1482. X
  1483. X
  1484. X
  1485. X
  1486. X
  1487. X
  1488. X
  1489. X
  1490. X
  1491. X
  1492. SHAR_EOF
  1493. chmod 0440 src/x_hash.c || echo "restore of src/x_hash.c fails"
  1494. if [ $TOUCH = can ]
  1495. then
  1496.     touch -am 0418223391 src/x_hash.c
  1497. fi
  1498. # ============= src/x_hash.h ==============
  1499. echo "x - extracting src/x_hash.h (Text)"
  1500. sed 's/^X//' << 'SHAR_EOF' > src/x_hash.h &&
  1501. X/* 
  1502. X
  1503. X   Hash table header file : 
  1504. X
  1505. X         x_hash.h 1.1 4/18/91 
  1506. X
  1507. X*/
  1508. X
  1509. X/*
  1510. X
  1511. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  1512. X
  1513. XThe author may be reached at the US MAIL address listed below, or
  1514. Xby sending unix mail to ...
  1515. X
  1516. X           tron1@tronsbox.xei.com            or
  1517. X       ...!uunet!tronsbox.xei.com!tron1  or
  1518. X       yelling "Hey Ken!" if you happen to be close enough.
  1519. X
  1520. X
  1521. X       SEE THE FILE "sharew.h" for details before you
  1522. X       use this code !!!
  1523. X
  1524. X*/
  1525. X
  1526. X
  1527. X#ifndef _xei_hash_h
  1528. X#define _xei_hash_h
  1529. X
  1530. X#include <string.h>
  1531. X#include <stdio.h>
  1532. X#include <x_list.h>
  1533. X
  1534. X#define HASH_NODUP 1
  1535. X#define HASH_REPLACE 2
  1536. X#define HASH_NOREPLACE 3
  1537. X#define HASH_NOADD 4
  1538. X#define HASH_GET 5
  1539. X#define HASH_GET_NEXT 6
  1540. X#define HASH_DELETE 7
  1541. X#define HASH_DELETE_ALL 8
  1542. X
  1543. Xstruct x_hash_entry {
  1544. X  long key_value;
  1545. X  void * data;
  1546. X};
  1547. X
  1548. Xstruct x_hash {
  1549. X  void * data;    
  1550. X  void * user;
  1551. X  long table_size;
  1552. X  struct x_list ** table_pointer;
  1553. X  long additions;
  1554. X  long collisions;
  1555. X  long replaces;
  1556. X};
  1557. X
  1558. Xlong hashkey( char * key );
  1559. Xlong indexhash( long key, long range );
  1560. Xlong hashsize( struct x_hash * table );
  1561. Xstruct x_hash * init_xhash( long initial_size );
  1562. Xstruct x_hash_entry * init_xhash_entry();
  1563. Xstruct x_hash * resize_xhash( struct x_hash * table, long new_size );
  1564. Xvoid * get_xhash( struct x_hash * table, long key, int hash_flag );
  1565. Xint put_xhash( struct x_hash * table, long key, void * data, int hash_flag);
  1566. Xint del_xhash( struct x_hash * table, long key, int hash_flag );
  1567. Xint set_user_xhash( struct xhash * table, void * user_data );
  1568. Xvoid * get_user_xhash( struct x_hash * table );
  1569. X
  1570. X#ifdef __cplusplus
  1571. X/* C++ Header files here -- class definitions and so on */
  1572. X
  1573. Xclass X_Hash{
  1574. X  struct x_hash * hash;        /* The private hash structure */
  1575. X public:
  1576. X  X_Hash( long isize = 1001 );
  1577. X  X_Hash( void * name , long isize = 1001);
  1578. X  long size();
  1579. X  int resize( long new_size );
  1580. X  void * get( long key, int hash_flag = HASH_GET );
  1581. X  int put( long key, void * new_data, int hash_flag = HASH_REPLACE );
  1582. X  int del( long key, int hash_flag );
  1583. X  int set_user( void * user_data );
  1584. X  void *get_user();
  1585. X};
  1586. X
  1587. X#endif  
  1588. X
  1589. X#endif
  1590. X
  1591. X
  1592. X
  1593. SHAR_EOF
  1594. chmod 0440 src/x_hash.h || echo "restore of src/x_hash.h fails"
  1595. if [ $TOUCH = can ]
  1596. then
  1597.     touch -am 0418223391 src/x_hash.h
  1598. fi
  1599. # ============= src/x_list.c ==============
  1600. echo "x - extracting src/x_list.c (Text)"
  1601. sed 's/^X//' << 'SHAR_EOF' > src/x_list.c &&
  1602. X/* 
  1603. X
  1604. X   Doubly linked list function file : 
  1605. X
  1606. X         x_list.c 1.1 4/18/91 
  1607. X
  1608. X*/
  1609. X
  1610. X/*
  1611. X
  1612. XThis text in this file is copyright (c) 1991 by Kenneth Jamieson.
  1613. X
  1614. XThe author may be reached at the US MAIL address listed below, or
  1615. Xby sending unix mail to ...
  1616. X
  1617. X           tron1@tronsbox.xei.com            or
  1618. X       ...!uunet!tronsbox.xei.com!tron1  or
  1619. X       yelling "Hey Ken!" if you happen to be close enough.
  1620. X
  1621. X
  1622. X       SEE THE FILE "sharew.h" for details before you
  1623. X       use this code !!!
  1624. X
  1625. X*/
  1626. X
  1627. X
  1628. X#include <copyr.h>
  1629. X#include <sharew.h>
  1630. X#include <x_list.h>
  1631. X#include <stdlib.h>
  1632. X
  1633. Xstruct x_list_entry * init_xlist_entry(){
  1634. X  struct x_list_entry * foo;
  1635. X  foo = (struct x_list_entry *)malloc( sizeof(struct x_list_entry) );
  1636. X  if( foo == NULL ){
  1637. X    return( foo );
  1638. X  }
  1639. X  foo->data = NULL;
  1640. X  foo->prev = NULL;
  1641. X  foo->next = NULL;
  1642. X  
  1643. X  return( foo );
  1644. X}
  1645. X
  1646. Xstruct x_list * init_xlist(){
  1647. X  struct x_list * foo;
  1648. X  foo = (struct x_list *)malloc( sizeof(struct x_list) );
  1649. X  if( foo == NULL ){
  1650. X    return( foo );
  1651. X  }
  1652. X  foo->data = NULL;
  1653. X  foo->first = NULL;
  1654. X  foo->current = NULL;
  1655. X  foo->last = NULL;
  1656. X  foo->count = 0;
  1657. X  foo->node = 0;
  1658. X  
  1659. X  return( foo );
  1660. X}
  1661. X
  1662. Xint add_xlist( struct x_list * xlist, void * new_data ){
  1663. X  if( xlist == NULL ){
  1664. X    return( (int)FALSE );
  1665. X  }
  1666. X  if( xlist->first == NULL ){        /* Is this the first entry ??? */
  1667. X    xlist->first = init_xlist_entry();  /* Create a entry to add to list */
  1668. X    if( xlist->first == NULL ){         
  1669. X      return( (int)FALSE );                  /* If we can't, fail             */
  1670. X    }
  1671. X    xlist->first->data = new_data;    /* Set the data pointer for the user */
  1672. X    xlist->current = xlist->first;    /* The first item is the current one!*/
  1673. X    xlist->last = xlist->first;        /* It is also the last !!          */
  1674. X    xlist->count = 1;            /* There is one item in the list     */
  1675. X    xlist->node = 0;            /* Just to be sure !             */
  1676. X    return( (int)TRUE );
  1677. X  }
  1678. X
  1679. X  xlist->last->next = init_xlist_entry(); /* Add a new node at end of list */
  1680. X  if( xlist->first == NULL ){
  1681. X    return( (int)FALSE );              /* If we can't, fail */
  1682. X  }  
  1683. X  xlist->last->next->prev = xlist->last;    /* Set parent of new node */
  1684. X  xlist->last->next->data = new_data;        /* Set data of new node   */
  1685. X  xlist->last = xlist->last->next;        /* Set pointer to last node*/
  1686. X  xlist->current = xlist->last;            /* Set the current pointer */
  1687. X  xlist->count = xlist->count+1;        /* Set the counter      */
  1688. X  xlist->node = xlist->count - 1;        /* Hehehehe        */
  1689. X  return( (int)TRUE );
  1690. X}
  1691. X
  1692. Xvoid * get_xlist( struct x_list * xlist ){
  1693. X  if( xlist == NULL ){
  1694. X    return( NULL );                /* if list pointer is bad */
  1695. X  }
  1696. X  if( xlist->current == NULL ){
  1697. X    return( NULL );                /* if list is empty       */
  1698. X  }
  1699. X  return( xlist->current->data );               /* Return the data        */
  1700. X}
  1701. X
  1702. Xint head_xlist( struct x_list * xlist ){
  1703. X  if( xlist == NULL ){
  1704. X    return( (int)FALSE );                /* if list pointer is bad */
  1705. X  }                                                    
  1706. X  if( xlist->first == NULL ){                                        
  1707. X    return( (int)FALSE );                /* if list is empty       */
  1708. X  }                                                    
  1709. X  xlist->current = xlist->first;        /* reset the current pointer*/
  1710. X  xlist->node = 0;                /* Reset node number */
  1711. X  return( (int)TRUE );
  1712. X}
  1713. X
  1714. Xint put_xlist( struct x_list * xlist, void * new_data ){
  1715. X  if( xlist == NULL ){
  1716. X    return( (int)FALSE );                /* if list pointer is bad */
  1717. X  }                                                    
  1718. X  if( xlist->current == NULL ){                                        
  1719. X    return( (int)FALSE );                /* if list is empty       */
  1720. X  }                                                    
  1721. X  xlist->current->data = new_data;        /* replace the data        */
  1722. X  return( (int)TRUE );
  1723. X}
  1724. X
  1725. Xint del_xlist( struct x_list * xlist ){
  1726. X  struct x_list_entry * foo;
  1727. X  if( xlist == NULL ){
  1728. X    return( (int)FALSE );                        /* if list pointer is bad */
  1729. X  }                                                    
  1730. X  if( xlist->current == NULL ){                                        
  1731. X    return( (int)FALSE );                /* if list is empty       */
  1732. X  }                                                    
  1733. X  foo = xlist->current;                
  1734. X  if( foo->prev != NULL ){            /* Is this the head ? */
  1735. X    foo->prev->next = foo->next; /* Set the child of our parent to pur child */
  1736. X  }else{            
  1737. X    xlist->first = foo->next;    /* We are the head, reset first when we go  */
  1738. X  }
  1739. X  if( foo->next != NULL ){        /* Are we the tail ?  */
  1740. X    foo->next->prev = foo->prev;    /* Set childs parent to our parent  */
  1741. X    xlist->current = foo->next;        /* Set the current to our child        */
  1742. X  }else{
  1743. X    xlist->current = foo->prev;        /* Set current to parent if no child*/
  1744. X    xlist->last = foo->next;        /* Reset the last pointer           */
  1745. X  }
  1746. X  xlist->count = xlist->count -1;    /* Decrement the counter            */
  1747. X  free((char *)foo);                /* Free the data            */
  1748. X  return( (int)TRUE );
  1749. X}
  1750. X
  1751. Xint next_xlist( struct x_list * xlist ){
  1752. X  if( xlist == NULL ){
  1753. X    return( (int)FALSE );             /* if list pointer is bad */
  1754. X  }                                                 
  1755. X  if( xlist->current == NULL ){                                     
  1756. X    return( (int)FALSE );             /* if list is empty       */
  1757. X  }
  1758. X  if( xlist->current->next == NULL ){
  1759. X    return( (int)FALSE );         /* At end of list, can't advance */
  1760. X  }
  1761. X  xlist->current = xlist->current->next; /* Advance current pointer       */
  1762. X  xlist->node = xlist->node + 1; 
  1763. X  return( (int)TRUE );
  1764. X}
  1765. X
  1766. Xint prev_xlist( struct x_list * xlist ){
  1767. X  if( xlist == NULL ){
  1768. X    return( (int)FALSE );             /* if list pointer is bad */
  1769. X  }                                                 
  1770. X  if( xlist->current == NULL ){                                     
  1771. X    return( (int)FALSE );             /* if list is empty       */
  1772. X  }
  1773. X  if( xlist->current->prev == NULL ){
  1774. X    return( (int)FALSE );             /* If we are at the start */
  1775. X  }
  1776. X  xlist->current = xlist->current->prev; /* Move the pointer back  */
  1777. X  xlist->node = xlist->node - 1;         /* Decrement the node */
  1778. X  return( (int)TRUE );
  1779. SHAR_EOF
  1780. echo "End of X_HASH part 1"
  1781. echo "File src/x_list.c is continued in part 2"
  1782. echo "2" > s3_seq_.tmp
  1783. exit 0
  1784. -- 
  1785. ========[ Xanadu Enterprises Inc. Amiga & Unix Software Development]=======
  1786. = "I know how you feel, you don't know if you want to hit me or kiss me - =
  1787. =  --- I get a lot of that."  Madonna as Breathless Mahoney (Dick Tracy)  =
  1788. =========== Ken Jamieson: uunet!tronsbox.xei.com!tron1  ===================
  1789. =     NONE of the opinions represented here are endorsed by anybody.      =
  1790. === The Romantic Encounters BBS 201-759-8450(PEP) / 201-759-8568(2400) ==== 
  1791.