This is HashExample.m in view mode; [Download] [Up]
/* File: HashExample.m - HashFile Example ('phone number to word translator) * * By: Christopher Lane * Symbolic Systems Resources Group * Knowledge Systems Laboratory * Stanford University * * Date: 09 November 1992 * * Copyright: 1990, 1991 & 1992 by The Leland Stanford Junior University. * This program may be distributed without restriction for non-commercial use. */ #import <stdlib.h> #import <stdio.h> #import <string.h> #import <ctype.h> #import <getopt.h> #import "HashFile.h" #define INTEGER @encode(int) #define STRING @encode(char *) #define OPTIONSTRING "bdh:" #define USAGE "usage: %s [-h database] [-d] [-b < wordlist] \n" typedef enum { BUILD = 'b', DUMP = 'd', HASHFILE = 'h' } OPTIONS; typedef enum { PROGRAM } ARGUMENTS; #define BUFFERSIZE LEAFSIZE #define DIGITMAX (7) #ifndef DATABASE #define DATABASE "PhoneWords" #endif const char *letters = "abcdefghijklmnoprstuvwxyABCDEFGHIJKLMNOPRSTUVWXY"; const char *numbers = "222333444555666777888999222333444555666777888999"; char *basename(char *s) { char *pointer; if((pointer = rindex(s, '/')) == NULL) return s; return ++pointer; } void buildTable(id table) { unsigned int key; char *s, *idx = NULL, value[BUFFERSIZE], buffer[BUFFERSIZE]; [table empty]; while(gets(value) != NULL) { if(strlen(s = value) > DIGITMAX) continue; key = 0; while(*s) if((idx = index(letters, *s++)) == NULL) break; else key = (key * 10) + ( numbers[idx - letters] - '0' ); if(idx == NULL) continue; #ifdef DEBUG printf("<%d\t%s\n", key, value); #endif if([table isKey:(void *) key]) s = strcat(strcat(strcpy(buffer, (char *) [table valueForKey:(void *) key]), " "), value); else s = value; [table insertKey:(void *) key value:(void *) NXCopyStringBuffer(s)]; } } void dumpTable(id table) { void *key, *value; NXHashState state = [table initState]; while([table nextState:&state key:&key value:&value]) (void) printf("%d\t%s\n", (int) key, (char *) value); } void main(int argc, char *argv[]) { id table = nil; char *database = DATABASE; int key, nitems, flag, option = HASHFILE, status = EXIT_SUCCESS; while((flag = getopt(argc, argv, OPTIONSTRING)) != EOF) switch(option = flag) { case BUILD : case DUMP : break; case HASHFILE : database = optarg; break; default : status = EXIT_FAILURE; break; } if(optind < argc || status == EXIT_FAILURE) { (void) fprintf(stderr, USAGE, basename(argv[PROGRAM])); exit(EXIT_FAILURE); } if(option == BUILD || [HashFile isHashFile:database]) { if((table = [[HashFile alloc] initFromFile:database keyDesc:INTEGER valueDesc:STRING]) == nil) { (void) fprintf(stderr, "%s: Can't open %s.\n", basename(argv[PROGRAM]), database); exit(EXIT_FAILURE); } } else if(option != BUILD) { (void) fprintf(stderr, "%s: Can't find %s.\n", basename(argv[PROGRAM]), database); exit(EXIT_FAILURE); } switch(option) { case BUILD : buildTable(table); break; case DUMP : dumpTable(table); break; default : while((nitems = scanf("%d", &key)) != EOF && nitems == 1) if([table isKey:(void *) key]) (void) printf("%d\t%s\n", key, (char *) [table valueForKey:(void *) key]); break; } [table free]; exit(status); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.