tron1@tronsbox.xei.com (Kenneth Jamieson) (04/20/91)
Submitted by: tron1@tronsbox Archive-name: X_HASH/part01 ---- Cut Here and unpack ---- #!/bin/sh # This is X_HASH, a shell archive (shar 3.10) # made 04/20/1991 04:00 UTC by tron1@tronsbox # Source directory /u1/home/tron1/src/tron1/shareware/x_hash # # existing files WILL be overwritten # # This is part 1 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 2791 -rw-r----- README # 241 -r--r----- src/copyr.h # 1826 -r--r----- src/make.unx # 3482 -r--r----- src/sharew.h # 8935 -r--r----- src/testhash.c # 9141 -r--r----- src/testlist.c # 10500 -r--r----- src/x_hash.c # 2075 -r--r----- src/x_hash.h # 9460 -r--r----- src/x_list.c # 3415 -r--r----- src/x_list.h # 1826 -r--r----- src/Makefile # 107 -rw-r----- text/install # 9661 -rw-r----- text/lists # 2856 -rw-r----- text/readme # 1311 -rw-r----- text/WHATIS # touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$ if [ -s /tmp/s3_touch$$ ] then TOUCH=can else TOUCH=cannot fi rm -f /tmp/s3_touch$$ if test -r s3_seq_.tmp then echo "Must unpack archives in sequence!" next=`cat s3_seq_.tmp`; echo "Please unpack part $next next" exit 1; fi # ============= README ============== echo "x - extracting README (Text)" sed 's/^X//' << 'SHAR_EOF' > README && X X ************** X * X_HASH 1.0 * X ************** X X NOTICE ! ! ! ! X X X_HASH IS >SHAREWARE< ! YOU MUST READ AND COMPLY WITH THE TERMS X IN THIS FILE IF YOU WISH TO USE THIS DATA IN ANY WAY!!! X X X_HASH IS (C)1991 BY KENNETH JAMIESON X X ALL RIGHTS RESERVED X X XNOTICE: X X THE TERM CODE SHALL BE USED TO MEAN ALL DATA AND SOURCE TEXT X PROVIDED WITH THIS PACKAGE. THIS INCLUDES ALL DOC FILES. X X THIS CODE IS "AS IS" , AND NO WARRANTY IS IMPLIED OR GIVEN ABOUT X IT BEING ACCURATE OR USEFUL IN ANY WAY FOR ANY PURPOSE. TO THE X EXTENT ALLOWED BY LAW THAT AUTHOR CLAIMS NO RESPONSIBILITY FOR X DAMAGES, REAL OR PERCEIVED, SUSTAINED FROM THE USE OF THIS CODE OR X THE IDEAS EXPRESSED IN THIS CODE. X X THIS DISCLAIMER APPLIES TO REGISTERED AND UNREGISTERED COPIES X OF THIS CODE. PAYMENT TO THE AUTHOR DOES NOT CHANGE THE LACK OF X WARRANTY. X X XSHAREWARE TERMS: X X * You will not violate, help to violate, or fail to report the X violation of the copyright notice that protects this code. X X * You may not use this code, in whole or part, in any commercial X program without the permission of the author. A commercial X program is any code, source or object, that the author has X asked payment for. This includes shareware. X X * This code must be distributed in it's original form. X X * No special fee may be charged for distributing this code. This X means that, for instance, and online service may charge for X downloading programs, but that charge cannot change base on if X it is THIS code that is being accessed. X X * You may use this code for thirty (30) days before payment is X due. This evaluation period begins when you first access this X code. After that time, you must register this code. X X * Registration allows you to use this code for an unlimited X period of time. Not: registration does NOT remove the X restriction on use in commercial code. X X * Contact the author to arrange for use in commercial code. X X * To register, send 15$ to the author: X X Kenneth Jamieson X P.o. Box 840 B X Kearny NJ 07032 X X X X ************************** X X Whew! Well, now that that is out of the way I feel better! X X You can reach me at the address above, or at 201-957-2438 (day). X X Also.... X X uunet!tronsbox!tron1 X tron1@tronsbox X uunet!fdurt1!wisdom!tronsbox!tron1 X X See the "text" directory for more info. X X========[ Xanadu Enterprises Inc. Amiga & Unix Software Development]======= X= "I know how you feel, you don't know if you want to hit me or kiss me - = X= --- I get a lot of that." Madonna as Breathless Mahoney (Dick Tracy) = X=========== Ken Jamieson: uunet!tronsbox.xei.com!tron1 =================== X= NONE of the opinions represented here are endorsed by anybody. = X=== The Romantic Encounters BBS 201-759-8450(PEP) / 201-759-8568(2400) ==== SHAR_EOF chmod 0640 README || echo "restore of README fails" if [ $TOUCH = can ] then touch -am 0419234191 README fi # ============= src/copyr.h ============== if test ! -d 'src' ; then echo "x - creating directory src" mkdir 'src' fi echo "x - extracting src/copyr.h (Text)" sed 's/^X//' << 'SHAR_EOF' > src/copyr.h && X/* X Copyright include notice : X X copyr.h 1.1 4/18/91 X X*/ X X/* XAll text in this file is copyright (c) 1991 by Kenneth Jamieson X*/ X#ifndef X_COPYRIGHT X#define X_COPYRIGHT "Compiled from source (c) 1991 Kenneth Jamieson" X#endif SHAR_EOF chmod 0440 src/copyr.h || echo "restore of src/copyr.h fails" if [ $TOUCH = can ] then touch -am 0418223391 src/copyr.h fi # ============= src/make.unx ============== echo "x - extracting src/make.unx (Text)" sed 's/^X//' << 'SHAR_EOF' > src/make.unx && X# UNIX Makefile for the x_list library X# X# Unix Makefile for x_list functions. X# X# make.unx 1.1 4/18/91 X# X# Set the CC variable to any compiler that can take ANSI C XCC=CC X X# Set any other flags you want the compiler to honor XCFLAGS=-O -I.. -I. -I../../include -L. -L../../lib X X# The command that is used to make an archive X# BSD and SUNOS X# ARCHIVE=ar cr X# System V XARCHIVE=ar -cr X Xall: testlist testhash X @echo " " X @echo "=======================================================" X @echo "= Done building x_hash list manager system... =" X @echo "= Run the program 'testit' to see if it works. =" X @echo "= Remember to type 'make install' if all went well. =" X @echo "= Then you can 'make clean' to get rid of temp files. =" X @echo "= - - - - - - - - - - - - - - - - - - - - - - - - - - =" X @echo "= Please don't forget that this is is shareware! =" X @echo "=======================================================" X @echo " " X Xinstall: X cp libx_list.a ../../lib X chmod 644 ../../lib/libx_list.a X cp x_list.h ../../include X chmod 644 ../../include/x_list.h X cp libx_hash.a ../../lib X chmod 644 ../../lib/libx_hash.a X cp x_hash.h ../../include X chmod 644 ../../include/x_hash.h X Xlibx_list.a: x_list.o X $(ARCHIVE) libx_list.a x_list.o X -ranlib libx_list.a X Xx_list.o: x_list.c x_list.h X $(CC) $(CFLAGS) -c x_list.c X Xtestlist: testlist.c libx_list.a x_list.h X $(CC) $(CFLAGS) -o testlist testlist.c -lx_list X Xlibx_hash.a: x_hash.o X $(ARCHIVE) libx_hash.a x_hash.o X -ranlib libx_hash.a X Xx_hash.o: x_hash.c x_hash.h x_list.h X $(CC) $(CFLAGS) -c x_hash.c X Xtesthash: testhash.c libx_hash.a libx_list.a x_hash.h X $(CC) $(CFLAGS) -o testhash testhash.c -lx_hash -lx_list X Xclean: X -rm x_hash.o X -rm libx_hash.a X -rm x_list.o X -rm libx_list.a X -rm testlist.o X -rm testlist X -rm testhash.o X -rm testhash X SHAR_EOF chmod 0440 src/make.unx || echo "restore of src/make.unx fails" if [ $TOUCH = can ] then touch -am 0418223391 src/make.unx fi # ============= src/sharew.h ============== echo "x - extracting src/sharew.h (Text)" sed 's/^X//' << 'SHAR_EOF' > src/sharew.h && X/* X Shareware license document : X X sharew.h 1.1 4/18/91 X X*/ X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X XAll rights are reserved by Kenneth Jamieson. X XYou are granted permission to use this code under the following Xrestrictions: X XNOTE: All occurrences of the word "code" below will apply to X all files, text, program source code and documentation. X X1) This code cannot be used in any program that is to be distributed X to anyone other than that program's author without the X written permission of Kenneth Jamieson. This permission will be granted X under the terms of registration listed below. X X2) This code may be used for a trial period of thirty (30) days. X At that time, you mus either register the code as below or X discontinue it's use. X X3) UNDER NO CIRCUMSTANCES may this code (registered or not) be used or X distributed in any way that will prevent it's future distribution X under the terms of this license. X X This specifically includes (but is not limited to) any code that X is to be distributed under the terms of the Free Software X Foundation's General Public License. X X4) Kenneth Jamieson reserves all rights to this code. X X5) NO WARRANTY is given or implied as to the usefulness or correctness of X this code for any purpose at all, whether this code is registered or not. X X XREGISTRATION: X X You are encouraged to register this code no matter what you use it for, X but you MUST register this code if you need written permission under X the terms above for distribution or intend to use it after the X trial period expires. X X In order to register this code, just send $15 US to the author at the X address listed below. X X Kenneth Jamieson X P.o. Box 387 X Kearny NJ 07023 X USA X X Once registered you will receive permission to use this code in your own X programs under the following restrictions: X X 1) Your program or documentation must mention that this code is in use, X and provide your user with information about where to obtain this X code. This information must be provided as part of the initial X cost (if any) of your software. X X 2) If you distribute the source to your program, then the source X for this code must accompany your code complete and unaltered. X X 3) UNDER NO CIRCUMSTANCES may this code (registered or not) be used or X distributed in any way that will prevent it's future distribution X under the terms of this license except by Kenneth Jamieson. X X This specifically includes (but is not limited to) any code that X is to be distributed under the terms of the Free Software X Foundation's General Public License. X X 4) Kenneth Jamieson reserves all rights to this code. X X 5) NO WARRANTY is given or implied as to the usefulness or correctness of X this code for any purpose at all, whether this code is registered or not. X X In addition, you will get a list of any known bugs and work-arounds, X notice of the next update (if any), and at least one "thank you". X X X X----------------------------------------------------- X* UNIX is a trademark of AT&T X* Amiga is a trademark of Commodore Business Machines X* MS-DOS is a trademark of Microsoft Inc X X*/ SHAR_EOF chmod 0440 src/sharew.h || echo "restore of src/sharew.h fails" if [ $TOUCH = can ] then touch -am 0418223391 src/sharew.h fi # ============= src/testhash.c ============== echo "x - extracting src/testhash.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/testhash.c && X/* X X Hash table test file : X X testhash.c 1.2 4/18/91 X X*/ X X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X X SEE THE FILE "sharew.h" for details before you X use this code !!! X X*/ X X#include <copyr.h> X#include <x_hash.h> X#include <stdio.h> X#include <stdlib.h> X#include <string.h> X X/* Not C++ -- so test the regular C functions */ X X#define INITIAL 20 X#define BIGGER 100 X X#ifndef __cplusplus X Xint main(){ X struct x_hash * test_xhash; X int loop; X int test; X int * foo; X char * testchar; X X printf("\ntestit - a testing program for the x_hash list\n"); X printf(" manager. testhash.c 1.2 4/18/91 \n\n"); X X test_xhash = init_xhash( INITIAL ); X if( test_xhash == NULL ){ X printf("ERROR! Cannot init_xhash of size %d.\n", INITIAL); X return( 0 ); X }else{ X printf("Ok.... Hash table initialized. \n"); X } X X if( hashsize( test_xhash ) != INITIAL ){ X printf("ERROR! Cannot hashsize error! Should be %d.\n", INITIAL); X return( 0 ); X }else{ X printf("Ok.... Hash table size correct. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key1"), (void*)"Key1", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key1 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key1 stored in the hash table. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key2"), (void*)"Key2", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key2 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key2 stored in the hash table. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key3"), (void*)"Key3", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key3 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key3 stored in the hash table. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key4 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key4 stored in the hash table. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4-2", X HASH_NOREPLACE) != TRUE ) X { X printf(" ERROR! Cannot use HASH_NOREPLACE !\n"); X return( 0 ); X }else{ X printf("Ok.... Replacement prevention works. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot replace keys !\n"); X return( 0 ); X }else{ X printf("Ok.... Replacement of keys works. \n"); X } X X if( put_xhash( test_xhash, hashkey("zzz"), (void*)"zzz", X HASH_NOADD) != FALSE ) X { X printf(" ERROR! Cannot use HASH_NOADD !\n"); X return( 0 ); X }else{ X printf("Ok.... Replace only mode works. \n"); X } X X if( put_xhash( test_xhash, hashkey("Key4"), (void*)"Key4", X HASH_NODUP) != FALSE ) X { X printf(" ERROR! Cannot prevent key duplicates !\n"); X return( 0 ); X }else{ X printf("Ok.... Duplicate key prevention works. \n"); X } X X testchar = (char * )get_xhash( test_xhash, hashkey("Key4"), HASH_GET ); X if( testchar == NULL ){ X printf("ERROR: get_xhash failed with the HASH_GET flag!\n"); X return( 0 ); X }else{ X test = strcmp( "Key4", testchar ); X if( test == 0 ){ X printf("Ok.... Getting data from hash table works fine.\n"); X }else{ X printf("ERROR: get_xhash returned \"%s\" should have been \"Key4\" !\n"); X return( 0 ); X } X } X X testchar = (char * )get_xhash( test_xhash, hashkey("Key4"), X HASH_GET_NEXT ); X if( testchar == NULL ){ X printf("ERROR: get_xhash failed with the HASH_GET_NEXT flag!\n"); X return( 0 ); X }else{ X test = strcmp( "Key4-2", testchar ); X if( test == 0 ){ X printf("Ok.... Getting secondary data from hash table works fine.\n"); X }else{ X printf( X "ERROR: get_xhash returned \"%s\" should have been \"Key4-2\" !\n"); X return( 0 ); X } X } X X if( del_xhash( test_xhash, hashkey("Key3"),HASH_DELETE) != TRUE ){ X printf(" ERROR! Cannot delete keys !\n"); X return( 0 ); X }else{ X testchar = (char * )get_xhash( test_xhash, hashkey("Key3"), X HASH_GET_NEXT ); X if(testchar != NULL){ X printf(" ERROR! Cannot delete keys !\n"); X return( 0 ); X } X printf("Ok.... Deletion of keys works. \n"); X } X X if( del_xhash( test_xhash, hashkey("Key4"), HASH_DELETE_ALL) == FALSE ){ X printf(" ERROR! Cannot delete multiple keys !\n"); X return( 0 ); X }else{ X testchar = (char * )get_xhash( test_xhash, hashkey("Key4"), X HASH_GET ); X if(testchar != NULL){ X printf(" ERROR! Cannot delete multiple keys on read! %s\n", testchar); X return( 0 ); X } X printf("Ok.... Deletion of multiple keys works. \n"); X } X X X} X X#endif X X#ifdef __cplusplus X Xint main(){ X X_Hash *test_xhash; X int test; X char * testchar; X X printf("\ntesthash - a testing program for the x_hash list\n"); X printf(" manager. testhash.c 1.2 4/18/91 \n\n"); X printf(" TESTING C++ INTERFACE\n\n"); X X test_xhash = new X_Hash( INITIAL ); X if( test_xhash == NULL ){ X printf("ERROR! Cannot construct a hash of size %d.\n", INITIAL); X return( 0 ); X }else{ X printf("Ok.... Hash table initialized. \n"); X } X X if( test_xhash->size() != INITIAL ){ X printf("ERROR! Cannot hashsize error! Should be %d.\n", INITIAL); X return( 0 ); X }else{ X printf("Ok.... Hash table size correct. \n"); X } X X if( test_xhash->put( hashkey("Key1"), (void*)"Key1", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key1 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key1 stored in the hash table. \n"); X } X X if( test_xhash->put( hashkey("Key2"), (void*)"Key2", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key2 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key2 stored in the hash table. \n"); X } X X if( test_xhash->put( hashkey("Key3"), (void*)"Key3", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key3 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key3 stored in the hash table. \n"); X } X X if( test_xhash->put( hashkey("Key4"), (void*)"Key4", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot store Key4 !\n"); X return( 0 ); X }else{ X printf("Ok.... Key4 stored in the hash table. \n"); X } X X if( test_xhash->put( hashkey("Key4"), (void*)"Key4-2", X HASH_NOREPLACE) != TRUE ) X { X printf(" ERROR! Cannot use HASH_NOREPLACE !\n"); X return( 0 ); X }else{ X printf("Ok.... Replacement prevention works. \n"); X } X X if( test_xhash->put( hashkey("Key4"), (void*)"Key4", X HASH_REPLACE) != TRUE ) X { X printf(" ERROR! Cannot replace keys !\n"); X return( 0 ); X }else{ X printf("Ok.... Replacement of keys works. \n"); X } X X if( test_xhash->put( hashkey("zzz"), (void*)"zzz", X HASH_NOADD) != FALSE ) X { X printf(" ERROR! Cannot use HASH_NOADD !\n"); X return( 0 ); X }else{ X printf("Ok.... Replace only mode works. \n"); X } X X if( test_xhash->put( hashkey("Key4"), (void*)"Key4", X HASH_NODUP) != FALSE ) X { X printf(" ERROR! Cannot prevent key duplicates !\n"); X return( 0 ); X }else{ X printf("Ok.... Duplicate key prevention works. \n"); X } X X testchar = (char * )test_xhash->get( hashkey("Key4"), HASH_GET ); X if( testchar == NULL ){ X printf("ERROR: get_xhash failed with the HASH_GET flag!\n"); X return( 0 ); X }else{ X test = strcmp( "Key4", testchar ); X if( test == 0 ){ X printf("Ok.... Getting data from hash table works fine.\n"); X }else{ X printf("ERROR: get() returned \"%s\" should have been \"Key4\" !\n"); X return( 0 ); X } X } X X testchar = (char * )test_xhash->get( hashkey("Key4"), HASH_GET_NEXT ); X if( testchar == NULL ){ X printf("ERROR: get_xhash failed with the HASH_GET_NEXT flag!\n"); X return( 0 ); X }else{ X test = strcmp( "Key4-2", testchar ); X if( test == 0 ){ X printf("Ok.... Getting secondary data from hash table works fine.\n"); X }else{ X printf( X "ERROR: get_xhash returned \"%s\" should have been \"Key4-2\" !\n"); X return( 0 ); X } X } X X if( test_xhash->del( hashkey("Key3"),HASH_DELETE) != TRUE ){ X printf(" ERROR! Cannot delete keys !\n"); X return( 0 ); X }else{ X testchar = (char * )test_xhash->get( hashkey("Key3"),HASH_GET_NEXT ); X if(testchar != NULL){ X printf(" ERROR! Cannot delete keys !\n"); X return( 0 ); X } X printf("Ok.... Deletion of keys works. \n"); X } X X if( test_xhash->del( hashkey("Key4"), HASH_DELETE_ALL) == FALSE ){ X printf(" ERROR! Cannot delete multiple keys !\n"); X return( 0 ); X }else{ X testchar = (char * )test_xhash->get( hashkey("Key4"),HASH_GET ); X if(testchar != NULL){ X printf(" ERROR! Cannot delete multiple keys on read! %s\n", testchar); X return( 0 ); X } X printf("Ok.... Deletion of multiple keys works. \n"); X } X X} X X#endif X X X X X X SHAR_EOF chmod 0440 src/testhash.c || echo "restore of src/testhash.c fails" if [ $TOUCH = can ] then touch -am 0418223391 src/testhash.c fi # ============= src/testlist.c ============== echo "x - extracting src/testlist.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/testlist.c && X/* X X Doubly linked list test file : X X testlist.c 4/18/91 1.4 X X*/ X X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X X SEE THE FILE "sharew.h" for details before you X use this code !!! X X*/ X X#include <copyr.h> X#include <x_list.h> X#include <stdio.h> X#include <stdlib.h> X X#ifndef __cplusplus X X/* Not C++ -- so test the regular C functions */ X Xint main(){ X struct x_list * test_xlist; X int loop; X int * foo; X X printf("\ntestit - a testing program for the x_list list\n"); X printf(" manager. testit.c testit.c 1.3 3/3/91 \n\n"); X X X /* Let's create the list that we will play with */ X test_xlist = init_xlist(); X if( test_xlist == NULL ){ X fprintf(stderr,"There is an error in the init_xlist() function!\n"); X return( FALSE ); X }else{ X printf("\nOk.... init_xlist() seems to be working ok!\n"); X } X X /* Let's set the user pointer just to play with ! */ X if( set_user_xlist( test_xlist, "User data test!" ) == FALSE ){ X fprintf(stderr,"Error in the set_user_xlist() function!\n"); X }else{ X printf("Ok.... set_user_xlist() seems to be working ok!\n"); X } X X /* Let's get the user pointer just to play with ! */ X if( get_user_xlist( test_xlist ) == NULL ){ X fprintf(stderr,"Error in the get_user_xlist() function!\n"); X return( FALSE ); X }else{ X printf("Ok.... get_user_xlist() seems to be working ok!\n"); X } X X /* Add 100 integers to the list just for fun ! */ X for( loop = 0; loop < 100; loop++ ){ X foo = (int *)malloc( sizeof(int) ); X if( foo == NULL ){ X fprintf(stderr,"Malloc error on test insert #%d !\n", loop); X return( FALSE ); X } X *foo = loop; X if( add_xlist( test_xlist, foo ) == FALSE ){ X fprintf(stderr,"add_xlist() error on test insert #%d !\n", loop); X return( FALSE ); X } X } X X /* Now .. see that the counter got set right! */ X if( get_count_xlist( test_xlist ) != 100 ){ X fprintf(stderr,"get_count_xlist() error! Said #%d, should be 100 !\n", X get_count_xlist( test_xlist ) ); X return( FALSE ); X }else{ X printf("Ok.... get_count_xlist() seams to be working ok!\n"); X } X X /* Now, reset the list to the end ! */ X if( tail_xlist( test_xlist ) == FALSE ){ X fprintf(stderr,"tail_xlist() error !\n", loop); X return( FALSE ); X }else{ X printf("Ok.... tail_xlist() seems to be working!\n"); X } X X /* Now, reset the list to the top ! */ X if( head_xlist( test_xlist ) == FALSE ){ X fprintf(stderr,"head_xlist() error !\n", loop); X return( FALSE ); X }else{ X printf("Ok.... head_xlist() seems to be working!\n"); X } X X /* Now, let's retrieve all that data and make sure that it is right ! */ X for( loop = 0; loop < 100; loop++ ){ X foo = (int *)get_xlist( test_xlist ); X if( foo == NULL ){ X fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( *foo != loop ){ X fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( get_nodenum_xlist( test_xlist ) != loop ){ X fprintf(stderr, X "get_nodenum_xlist() error on test retrieve #%d !\n", loop); X } X if( next_xlist( test_xlist ) == FALSE && loop != 99 ){ X fprintf(stderr,"next_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X } X X printf("Ok.... 100 retrieves went ok, next_xlist() is working fine !\n"); X X /* Now, let's retrieve all that data and make sure that it is right ! */ X for( loop = 99; loop > -1; loop-- ){ X foo = (int *)get_xlist( test_xlist ); X if( foo == NULL ){ X fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( *foo != loop ){ X fprintf(stderr,"get_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( get_nodenum_xlist( test_xlist ) != loop ){ X fprintf(stderr, X "get_nodenum_xlist() error on test retrieve #%d !\n", loop); X } X if( prev_xlist( test_xlist ) == FALSE && loop != 0 ){ X fprintf(stderr,"prev_xlist() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X } X X printf("Ok.... 100 retrieves went ok, prev_xlist() is working fine !\n"); X X if( goto_xlist( test_xlist, 50 ) == FALSE ){ X fprintf(stderr,"goto_xlist() error !\n"); X return( FALSE ); X } X foo = (int *)get_xlist( test_xlist ); X if( foo == NULL ){ X fprintf(stderr, X "get_xlist() error on retrieve for goto_xlist() !\n"); X return( FALSE ); X } X if( *foo != 50 ){ X fprintf(stderr, X "get_xlist() error on retrieve for goto_xlist() !\n"); X return( FALSE ); X } X printf("Ok.... goto_xlist() seems to be working fine !\n"); X X if( get_nodenum_xlist( test_xlist ) != 50 ){ X fprintf(stderr, X "get_nodenum_xlist() error (does not match)! \n"); X return( FALSE ); X } X printf("Ok.... get_nodenum_xlist() seems to be working ok! \n"); X X X if( free_xlist( test_xlist ) == FALSE ){ X fprintf(stderr,"free_xlist() error !!! \n"); X return( FALSE ); X }else{ X printf("Ok.... free_xlist() seems to be working! \n"); X } X X printf("\nAll tests passed ! Congratulations !\n\n"); X return( TRUE ); X} X X#endif X X#ifdef __cplusplus X X/* C++ -- so test the C++ functions */ X Xint main(){ X X_List test_xlist; X int loop; X int * foo; X X printf("\ntestit - a testing program for the x_list list\n"); X printf(" manager (C++ version). testit.c testit.c 1.3 3/3/91\n\n"); X X /* Let's set the user pointer just to play with ! */ X if( test_xlist.set_user( "User data test!" ) == FALSE ){ X fprintf(stderr,"Error in the X_List.set_user() function!\n"); X }else{ X printf("Ok.... X_List.set_user() seems to be working ok!\n"); X } X X /* Let's get the user pointer just to play with ! */ X if( test_xlist.get_user() == NULL ){ X fprintf(stderr,"Error in the X_List.get_user() function!\n"); X return( FALSE ); X }else{ X printf("Ok.... X_List.get_user() seems to be working ok!\n"); X } X X /* Add 100 integers to the list just for fun ! */ X for( loop = 0; loop < 100; loop++ ){ X foo = (int *)malloc( sizeof(int) ); X if( foo == NULL ){ X fprintf(stderr,"Malloc error on test insert #%d !\n", loop); X return( FALSE ); X } X *foo = loop; X if( test_xlist.add( foo ) == FALSE ){ X fprintf(stderr,"X_List.add() error on test insert #%d !\n", loop); X return( FALSE ); X } X } X X /* Now .. see that the counter got set right! */ X if( test_xlist.count() != 100 ){ X fprintf(stderr,"X_List.count() error! Said #%d, should be 100 !\n", X test_xlist.count() ); X return( FALSE ); X }else{ X printf("Ok.... X_List.count() seams to be working ok!\n"); X } X X /* Now, reset the list to the top ! */ X if( test_xlist.head() == FALSE ){ X fprintf(stderr,"X_List.head() error !\n", loop); X return( FALSE ); X }else{ X printf("Ok.... X_List.head() seems to be working!\n"); X } X X /* Now, let's retrieve all that data and make sure that it is right ! */ X for( loop = 0; loop < 100; loop++ ){ X foo = (int *)test_xlist.get(); X if( foo == NULL ){ X fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( *foo != loop ){ X fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( test_xlist.next() == FALSE && loop != 99 ){ X fprintf(stderr,"X_List.next() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X } X X printf("Ok.... 100 retrieves went ok, X_List.next() is working fine !\n"); X X /* Now, let's retrieve all that data and make sure that it is right ! */ X for( loop = 99; loop > -1; loop-- ){ X foo = (int *)test_xlist.get(); X if( foo == NULL ){ X fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( *foo != loop ){ X fprintf(stderr,"X_List.get() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X if( test_xlist.prev() == FALSE && loop != 0 ){ X fprintf(stderr,"X_List.prev() error on test retrieve #%d !\n", loop); X return( FALSE ); X } X } X X printf("Ok.... 100 retrieves went ok, X_List.prev() is working fine !\n"); X X /* Now, let's retrieve it with the [] operator ! */ X for( loop = 99; loop > -1; loop-- ){ X foo = (int *)test_xlist[loop]; X if( foo == NULL ){ X fprintf(stderr,"X_List operator [] error on #%d !\n", loop); X return( FALSE ); X } X if( *foo != loop ){ X fprintf(stderr,"X_List operator [] error on #%d !\n", loop); X return( FALSE ); X } X if( test_xlist.nodenum() != loop ){ X fprintf(stderr,"X_List.nodenum() error on #%d!\n", loop); X } X } X printf("Ok.... X_List.goto_node() seems to work ok!\n"); X printf("Ok.... X_List.nodenum() seems to work ok!\n"); X printf("Ok.... the operator [] seems to work ok!\n"); X X printf("\nAll tests passed ! Congratulations !\n\n"); X return( TRUE ); X} X X#endif X X SHAR_EOF chmod 0440 src/testlist.c || echo "restore of src/testlist.c fails" if [ $TOUCH = can ] then touch -am 0418223391 src/testlist.c fi # ============= src/x_hash.c ============== echo "x - extracting src/x_hash.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/x_hash.c && X/* X X Hash table function file : X X x_hash.c 1.1 4/18/91 X X*/ X X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X X SEE THE FILE "sharew.h" for details before you X use this code !!! X X*/ X X X#include <string.h> X#include <malloc.h> X#include <memory.h> X#include <x_hash.h> X Xlong hashkey( char * key ){ X long hash = 0; X long i = 0; X long slen = 0; X X slen = strlen( key ); X X if( key == NULL || slen == 0 ){ X return( (long)NULL ); X } X X for( i = 0; i < slen; i++ ){ X hash = hash - (int)*(key+i); X hash = hash << 1; X } X if( hash < 0 ){ X hash = hash * -1; X } X return( hash ); X} X Xlong indexhash( long key, long range ){ X long index; X X if( key == 0 || range == 0 ){ X return( NULL ); X } X index = key % range; X return( index ); X} X Xlong hashsize( struct x_hash * table ){ X if( table == NULL ){ X return( FALSE ); X } X return( table->table_size ); X} X Xstruct x_hash * init_xhash( long initial_size ){ X struct x_hash * tmp1; X struct x_list ** tmp2; X int loop; X X tmp1 = (struct x_hash *)malloc( sizeof( struct x_hash ) ); X if( tmp1 == NULL ){ X return( NULL ); X } X X tmp2 = (struct x_list **)malloc( (unsigned int)initial_size*sizeof(struct x_list *) ); X if( tmp2 == NULL ){ X return( NULL ); X } X X for( loop = 0; loop < initial_size; loop ++){ X tmp2[loop] = init_xlist(); X } X tmp1->table_size = initial_size; X tmp1->table_pointer = tmp2; X tmp1->additions = 0; X tmp1->collisions = 0; X tmp1->replaces = 0; X X return( tmp1 ); X} X Xstruct x_hash_entry * init_xhash_entry(){ X struct x_hash_entry * foo; X foo = (struct x_hash_entry *)malloc( sizeof(struct x_hash_entry) ); X foo->key_value = 0; X foo->data = NULL; X return( foo ); X} X Xint put_xhash( struct x_hash * table, long key, void * data, int hash_flag ){ X struct x_hash_entry *entry; X struct x_hash_entry *buffer; X long foo; X long subscript; X X if( table == NULL ){ X return( FALSE ); X } X X entry = init_xhash_entry(); X if( entry == NULL ){ X return( FALSE ); X } X entry->key_value = key; X /* Set key value of new data */ X entry->data = data; X /* Set data pointer to data */ X X subscript = indexhash( key, table->table_size ); X X switch( hash_flag ){ X case HASH_NOREPLACE: return( X add_xlist( table->table_pointer[subscript], X (void *)entry ) X ); X break; X X case HASH_REPLACE: head_xlist( table->table_pointer[subscript] ); X buffer = (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( buffer == NULL ){ X /* No table entries ! add it */ X return( add_xlist( X table->table_pointer[subscript], X (void *)entry ) ); X } X if( buffer->key_value == entry->key_value ){ X /* Replace it !!! */ X return( put_xlist( X table->table_pointer[subscript], X (void *)entry ) ); X } X foo = next_xlist(table->table_pointer[subscript] ); X if( foo == FALSE ){ X /* End of list! */ X return(add_xlist(table->table_pointer[subscript], X (void *)entry ) ); X } X } X break; X X case HASH_NODUP: head_xlist( table->table_pointer[subscript] ); X buffer = X (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( buffer == NULL ){ X /* No table entries ! add it */ X return(add_xlist(table->table_pointer[subscript], X (void *)entry ) ); X } X if( buffer->key_value == entry->key_value ){ X /* Replace it !!! */ X return( FALSE ); X } X foo = next_xlist(table->table_pointer[subscript] ); X if( foo == FALSE ){ X /* End of list! */ X return(add_xlist(table->table_pointer[subscript], X (void *)entry ) ); X } X } X break; X X case HASH_NOADD: head_xlist( table->table_pointer[subscript] ); X buffer = (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( buffer == NULL ){ X /* No table entries ! add it */ X return( FALSE ); X } X if( buffer->key_value == entry->key_value ){ X /* Replace it !!! */ X return(put_xlist(table->table_pointer[subscript], X (void *)entry ) ); X } X foo = next_xlist(table->table_pointer[subscript] ); X if( foo == FALSE ){ X /* End of list! */ X return( FALSE ); X } X } X break; X X default: return( FALSE ); X break; X } X X} X Xvoid * get_xhash( struct x_hash * table, long key, int hash_flag ){ X struct x_hash_entry *buffer; X long foo; X long subscript; X X if( table == NULL ){ X return( NULL ); X } X X subscript = indexhash( key, table->table_size ); X X switch( hash_flag ){ X case HASH_GET: head_xlist( table->table_pointer[subscript] ); X buffer = (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( buffer == NULL ){ X /* No table entries ! */ X return( NULL ); X } X if( buffer->key_value == key ){ X /* Return it !!! */ X return( buffer->data ); X } X foo = next_xlist(table->table_pointer[subscript] ); X if( foo == FALSE ){ X /* End of list! */ X return( NULL ); X } X } X break; X X case HASH_GET_NEXT: /*NOTICE: We do NOT reset the list this time !!!!! */ X foo = next_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( foo == FALSE ){ X /* End of list! */ X return( NULL ); X } X buffer = (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X if( buffer == NULL ){ X /* No table entries ! */ X return( NULL ); X } X if( buffer->key_value == key ){ X /* Return it !!! */ X return( buffer->data ); X } X foo = next_xlist(table->table_pointer[subscript] ); X } X break; X X default: return( NULL ); X break; X } X X} X Xstruct x_hash * resize_xhash( struct x_hash * table, long new_size ){ X struct x_hash * new_table; X struct x_hash_entry * buffer; X long loop; X X new_table = init_xhash( new_size ); X if( new_table == NULL ){ X return( NULL ); X } X for( loop = 0; loop < table->table_size ; loop++ ){ X if( head_xlist( table->table_pointer[loop] ) != FALSE ){ X buffer = (struct x_hash_entry *)get_xlist( table->table_pointer[loop] ); X if( buffer == NULL ){ /* Should never happen! */ X return( NULL ); X } X if( put_xhash(new_table,buffer->key_value, X buffer->data, HASH_NOREPLACE ) == FALSE ){ X return( NULL ); X } X while( next_xlist( table->table_pointer[loop] ) == TRUE ){ X buffer = (struct x_hash_entry *)get_xlist(table->table_pointer[loop]); X if( buffer == NULL ){ X return( NULL ); X } X if( put_xhash( new_table, buffer->key_value, X buffer->data, HASH_NOREPLACE ) == FALSE ){ X return( NULL ); X } X } X } /* If reset_xhash != FALSE .. this list has at least one entry */ X } X return( new_table ); X} X Xint del_xhash( struct x_hash * table, long key, int hash_flag ){ X int retval; X struct x_hash_entry *buffer; X long foo; X long subscript; X X retval = FALSE; X if( table == NULL ){ X return( FALSE ); X } X subscript = indexhash( key, table->table_size ); X switch( hash_flag ){ X case HASH_DELETE: head_xlist( table->table_pointer[subscript] ); X buffer = (struct x_hash_entry *) X get_xlist( table->table_pointer[subscript] ); X while( 1 ){ X if( buffer == NULL ){ X /* No table entries ! */ X return( FALSE ); X } X if( buffer->key_value == key ){ X /* Delete it !!! */ X return( X del_xlist(table->table_pointer[subscript]) X ); X } X foo = next_xlist(table->table_pointer[subscript] ); X if( foo == FALSE ){ X /* End of list! */ X return( FALSE ); X } X } X break; X case HASH_DELETE_ALL: X while( del_xhash( table, key, HASH_DELETE ) X == TRUE ){ X retval++; X } X return( retval ); X break; X default: return( FALSE ); X break; X } X} X Xint set_user_xhash( struct x_hash * table, void * user_data){ X if( table == NULL ){ X return( NULL ); X } X table->user = user_data; X return(TRUE); X} X Xvoid *get_user_xhash( struct x_hash * table ){ X if( table == NULL ){ X return( NULL ); X } X return( table->user ); X} X X#ifdef __cplusplus X XX_Hash::X_Hash( long isize ){ X hash = init_xhash( isize ); X} X XX_Hash::X_Hash( void * name, long isize ){ X hash = init_xhash( isize ); X if( hash != NULL ){ X set_user_xhash( hash, name ); X } X} X Xlong X_Hash::size(){ X if( hash != NULL ){ X return( hashsize( hash ) ); X } X return( NULL ); X} X Xint X_Hash::resize( long new_size ){ X if( hash != NULL ){ X hash = resize_xhash( hash, new_size ); X if( hash != NULL ){ X return( TRUE ); X } X } X return( FALSE ); X} X Xvoid * X_Hash::get( long key, int hash_flag ){ X if( hash != NULL ){ X return( get_xhash( hash, key, hash_flag ) ); X } X return( NULL ); X} X Xint X_Hash::put( long key, void * new_data, int hash_flag ){ X if( hash != NULL ){ X return( put_xhash( hash, key, new_data, hash_flag ) ); X } X return( FALSE ); X} X Xint X_Hash::del( long key, int hash_flag ){ X if( hash != NULL ){ X return( del_xhash( hash, key, hash_flag ) ); X } X return( FALSE ); X} X Xint X_Hash::set_user( void * user_data ){ X if( hash != NULL ){ X return( set_user_xhash( hash, user_data ) ); X } X return( FALSE ); X} X Xvoid *X_Hash::get_user(){ X if( hash != NULL ){ X return( get_user_xhash( hash ) ); X } X return( FALSE ); X} X X#endif X X X X X X X X X X X X X X X X SHAR_EOF chmod 0440 src/x_hash.c || echo "restore of src/x_hash.c fails" if [ $TOUCH = can ] then touch -am 0418223391 src/x_hash.c fi # ============= src/x_hash.h ============== echo "x - extracting src/x_hash.h (Text)" sed 's/^X//' << 'SHAR_EOF' > src/x_hash.h && X/* X X Hash table header file : X X x_hash.h 1.1 4/18/91 X X*/ X X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X X SEE THE FILE "sharew.h" for details before you X use this code !!! X X*/ X X X#ifndef _xei_hash_h X#define _xei_hash_h X X#include <string.h> X#include <stdio.h> X#include <x_list.h> X X#define HASH_NODUP 1 X#define HASH_REPLACE 2 X#define HASH_NOREPLACE 3 X#define HASH_NOADD 4 X#define HASH_GET 5 X#define HASH_GET_NEXT 6 X#define HASH_DELETE 7 X#define HASH_DELETE_ALL 8 X Xstruct x_hash_entry { X long key_value; X void * data; X}; X Xstruct x_hash { X void * data; X void * user; X long table_size; X struct x_list ** table_pointer; X long additions; X long collisions; X long replaces; X}; X Xlong hashkey( char * key ); Xlong indexhash( long key, long range ); Xlong hashsize( struct x_hash * table ); Xstruct x_hash * init_xhash( long initial_size ); Xstruct x_hash_entry * init_xhash_entry(); Xstruct x_hash * resize_xhash( struct x_hash * table, long new_size ); Xvoid * get_xhash( struct x_hash * table, long key, int hash_flag ); Xint put_xhash( struct x_hash * table, long key, void * data, int hash_flag); Xint del_xhash( struct x_hash * table, long key, int hash_flag ); Xint set_user_xhash( struct xhash * table, void * user_data ); Xvoid * get_user_xhash( struct x_hash * table ); X X#ifdef __cplusplus X/* C++ Header files here -- class definitions and so on */ X Xclass X_Hash{ X struct x_hash * hash; /* The private hash structure */ X public: X X_Hash( long isize = 1001 ); X X_Hash( void * name , long isize = 1001); X long size(); X int resize( long new_size ); X void * get( long key, int hash_flag = HASH_GET ); X int put( long key, void * new_data, int hash_flag = HASH_REPLACE ); X int del( long key, int hash_flag ); X int set_user( void * user_data ); X void *get_user(); X}; X X#endif X X#endif X X X SHAR_EOF chmod 0440 src/x_hash.h || echo "restore of src/x_hash.h fails" if [ $TOUCH = can ] then touch -am 0418223391 src/x_hash.h fi # ============= src/x_list.c ============== echo "x - extracting src/x_list.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/x_list.c && X/* X X Doubly linked list function file : X X x_list.c 1.1 4/18/91 X X*/ X X/* X XThis text in this file is copyright (c) 1991 by Kenneth Jamieson. X XThe author may be reached at the US MAIL address listed below, or Xby sending unix mail to ... X X tron1@tronsbox.xei.com or X ...!uunet!tronsbox.xei.com!tron1 or X yelling "Hey Ken!" if you happen to be close enough. X X X SEE THE FILE "sharew.h" for details before you X use this code !!! X X*/ X X X#include <copyr.h> X#include <sharew.h> X#include <x_list.h> X#include <stdlib.h> X Xstruct x_list_entry * init_xlist_entry(){ X struct x_list_entry * foo; X foo = (struct x_list_entry *)malloc( sizeof(struct x_list_entry) ); X if( foo == NULL ){ X return( foo ); X } X foo->data = NULL; X foo->prev = NULL; X foo->next = NULL; X X return( foo ); X} X Xstruct x_list * init_xlist(){ X struct x_list * foo; X foo = (struct x_list *)malloc( sizeof(struct x_list) ); X if( foo == NULL ){ X return( foo ); X } X foo->data = NULL; X foo->first = NULL; X foo->current = NULL; X foo->last = NULL; X foo->count = 0; X foo->node = 0; X X return( foo ); X} X Xint add_xlist( struct x_list * xlist, void * new_data ){ X if( xlist == NULL ){ X return( (int)FALSE ); X } X if( xlist->first == NULL ){ /* Is this the first entry ??? */ X xlist->first = init_xlist_entry(); /* Create a entry to add to list */ X if( xlist->first == NULL ){ X return( (int)FALSE ); /* If we can't, fail */ X } X xlist->first->data = new_data; /* Set the data pointer for the user */ X xlist->current = xlist->first; /* The first item is the current one!*/ X xlist->last = xlist->first; /* It is also the last !! */ X xlist->count = 1; /* There is one item in the list */ X xlist->node = 0; /* Just to be sure ! */ X return( (int)TRUE ); X } X X xlist->last->next = init_xlist_entry(); /* Add a new node at end of list */ X if( xlist->first == NULL ){ X return( (int)FALSE ); /* If we can't, fail */ X } X xlist->last->next->prev = xlist->last; /* Set parent of new node */ X xlist->last->next->data = new_data; /* Set data of new node */ X xlist->last = xlist->last->next; /* Set pointer to last node*/ X xlist->current = xlist->last; /* Set the current pointer */ X xlist->count = xlist->count+1; /* Set the counter */ X xlist->node = xlist->count - 1; /* Hehehehe */ X return( (int)TRUE ); X} X Xvoid * get_xlist( struct x_list * xlist ){ X if( xlist == NULL ){ X return( NULL ); /* if list pointer is bad */ X } X if( xlist->current == NULL ){ X return( NULL ); /* if list is empty */ X } X return( xlist->current->data ); /* Return the data */ X} X Xint head_xlist( struct x_list * xlist ){ X if( xlist == NULL ){ X return( (int)FALSE ); /* if list pointer is bad */ X } X if( xlist->first == NULL ){ X return( (int)FALSE ); /* if list is empty */ X } X xlist->current = xlist->first; /* reset the current pointer*/ X xlist->node = 0; /* Reset node number */ X return( (int)TRUE ); X} X Xint put_xlist( struct x_list * xlist, void * new_data ){ X if( xlist == NULL ){ X return( (int)FALSE ); /* if list pointer is bad */ X } X if( xlist->current == NULL ){ X return( (int)FALSE ); /* if list is empty */ X } X xlist->current->data = new_data; /* replace the data */ X return( (int)TRUE ); X} X Xint del_xlist( struct x_list * xlist ){ X struct x_list_entry * foo; X if( xlist == NULL ){ X return( (int)FALSE ); /* if list pointer is bad */ X } X if( xlist->current == NULL ){ X return( (int)FALSE ); /* if list is empty */ X } X foo = xlist->current; X if( foo->prev != NULL ){ /* Is this the head ? */ X foo->prev->next = foo->next; /* Set the child of our parent to pur child */ X }else{ X xlist->first = foo->next; /* We are the head, reset first when we go */ X } X if( foo->next != NULL ){ /* Are we the tail ? */ X foo->next->prev = foo->prev; /* Set childs parent to our parent */ X xlist->current = foo->next; /* Set the current to our child */ X }else{ X xlist->current = foo->prev; /* Set current to parent if no child*/ X xlist->last = foo->next; /* Reset the last pointer */ X } X xlist->count = xlist->count -1; /* Decrement the counter */ X free((char *)foo); /* Free the data */ X return( (int)TRUE ); X} X Xint next_xlist( struct x_list * xlist ){ X if( xlist == NULL ){ X return( (int)FALSE ); /* if list pointer is bad */ X } X if( xlist->current == NULL ){ X return( (int)FALSE ); /* if list is empty */ X } X if( xlist->current->next == NULL ){ X return( (int)FALSE ); /* At end of list, can't advance */ X } X xlist->current = xlist->current->next; /* Advance current pointer */ X xlist->node = xlist->node + 1; X return( (int)TRUE ); X} X Xint prev_xlist( struct x_list * xlist ){ X if( xlist == NULL ){ X return( (int)FALSE ); /* if list pointer is bad */ X } X if( xlist->current == NULL ){ X return( (int)FALSE ); /* if list is empty */ X } X if( xlist->current->prev == NULL ){ X return( (int)FALSE ); /* If we are at the start */ X } X xlist->current = xlist->current->prev; /* Move the pointer back */ X xlist->node = xlist->node - 1; /* Decrement the node */ X return( (int)TRUE ); SHAR_EOF echo "End of X_HASH part 1" echo "File src/x_list.c is continued in part 2" echo "2" > s3_seq_.tmp exit 0 -- ========[ Xanadu Enterprises Inc. Amiga & Unix Software Development]======= = "I know how you feel, you don't know if you want to hit me or kiss me - = = --- I get a lot of that." Madonna as Breathless Mahoney (Dick Tracy) = =========== Ken Jamieson: uunet!tronsbox.xei.com!tron1 =================== = NONE of the opinions represented here are endorsed by anybody. = === The Romantic Encounters BBS 201-759-8450(PEP) / 201-759-8568(2400) ====