|
|
1.1 ! root 1: /*************************************************************/ ! 2: /** **/ ! 3: /** Microsoft RPC Examples **/ ! 4: /** Dictionary Application **/ ! 5: /** Copyright(c) Microsoft Corp. 1991 **/ ! 6: /** **/ ! 7: /*************************************************************/ ! 8: ! 9: /* ! 10: ************************************************************************* ! 11: * Local dictionary :play" example * ! 12: * * ! 13: * Created: Dov Harel 7/1988 * ! 14: * Simplified / unified interface to dict Dov Harel 12/1990 * ! 15: * Revived to fit remote play (replay) Dov Harel 5/1/1991 * ! 16: * * ! 17: * Description: * ! 18: * This file contains a simple interactive loop of calls to the * ! 19: * dictionary. The interface is identical to the remote dictionary * ! 20: * program described in the readme file. * ! 21: ************************************************************************* ! 22: */ ! 23: ! 24: #include <stdio.h> ! 25: #include <malloc.h> ! 26: #include <stdlib.h> ! 27: #include <string.h> ! 28: #include <ctype.h> ! 29: #include <windows.h> ! 30: ! 31: #include "dict0.h" ! 32: #include "play.h" ! 33: #include "util0.h" ! 34: ! 35: #define TAB_STOPS 3 ! 36: ! 37: void Usage() ! 38: { ! 39: printf("Usage : play \n\n"); ! 40: exit(1); ! 41: } ! 42: ! 43: /*************************************************************************/ ! 44: /*** Remote Dictionary Test Loop ***/ ! 45: /*************************************************************************/ ! 46: ! 47: void ! 48: Usage_Msg() ! 49: { ! 50: printf("Usage: \nType a single character, followed by an optional key as follows:\n\n"); ! 51: printf("i <key> :: Insert <key> into dictionary\n"); ! 52: printf("d <key> :: Delete <key> from dictionary\n"); ! 53: printf("f <key> :: Find <key> in dictionary\n"); ! 54: printf("n :: Next of local current item in dictionary\n"); ! 55: printf("p :: Previous of local current item in dictionary\n"); ! 56: printf("h :: Head (first item) of dictionary\n"); ! 57: printf("t :: Tail (last item) of dictionary\n"); ! 58: printf("? :: Print this message\n"); ! 59: printf("q :: Quit\n\n"); ! 60: printf("<key> is <integer> <string>"); ! 61: } ! 62: ! 63: /*************************************************************************/ ! 64: /*** Minimal Dictionary Operations: ***/ ! 65: /*** ***/ ! 66: /*** Dictionary *Dict_New(Cmp_rec*, Splay*, print_rec*) ***/ ! 67: /*** ***/ ! 68: /*** Dict_Status Dict_Find(Dictionary*, Item*) ***/ ! 69: /*** Dict_Status Dict_Next(Dictionary*, Item*) ***/ ! 70: /*** Dict_Status Dict_Prev(Dictionary*, Item*) ***/ ! 71: /*** Dict_Status Dict_Insert(Dictionary*, Item*) ***/ ! 72: /*** Dict_Status Dict_Delete(Dictionary*, Item**) ***/ ! 73: /*** ***/ ! 74: /*** Item* DICT_CURR_ITEM(Dict*) ***/ ! 75: /*************************************************************************/ ! 76: ! 77: void ! 78: TestLoop( Dictionary * pdict ) ! 79: { ! 80: // reconstructed from the test loop in client.c... ! 81: // local variables need substantial clean up... ! 82: ! 83: char currName[80]; ! 84: char name[80]; ! 85: char op = 0; ! 86: char buffer[80]; ! 87: ! 88: Record r, currRecord; ! 89: Record *pcurrRecord = &currRecord; ! 90: Record *pr = &r; ! 91: Record * pNullRecord = NULL; ! 92: ! 93: Dict_Status status; ! 94: short i; ! 95: ! 96: // Dictionary * pdict = *pvd; ! 97: ! 98: pcurrRecord->name = currName; ! 99: pr->name = name; ! 100: ! 101: // VDict_Curr_Item(*pvd, &pcurrRecord); ! 102: ! 103: // Dict_Print(pdict, TAB_STOPS); ! 104: Usage_Msg(); ! 105: ! 106: while ( op != 'q' ) { ! 107: ! 108: printf("\nnext op (i d x f n N p P h t ? q): "); ! 109: gets(buffer); ! 110: op = buffer[0]; ! 111: ! 112: if (op == 'i' || op == 'd' || op == 'f' || ! 113: op == '+' || op == '-' || op == 'I') ! 114: sscanf(buffer+1, "%d %s", &pr->key, pr->name); ! 115: ! 116: switch (op) { ! 117: case 'h': ! 118: // get Head of list (first record); ! 119: ! 120: status = Dict_Next( pdict, NULL ); ! 121: ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord); ! 122: ItemCopy( DICT_CURR_ITEM(pdict), pr); ! 123: break; ! 124: ! 125: case 't': ! 126: // get Tail of list (last record) ! 127: ! 128: status = Dict_Prev( pdict, NULL ); ! 129: ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord); ! 130: ItemCopy( DICT_CURR_ITEM(pdict), pr); ! 131: break; ! 132: ! 133: case 'f': ! 134: // Find <key> ! 135: ! 136: status = Dict_Find(pdict, pr); ! 137: break; ! 138: ! 139: case 'n': ! 140: // get Next record ! 141: ! 142: status = Dict_Next( pdict, pcurrRecord ); ! 143: ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord); ! 144: break; ! 145: ! 146: case 'p': ! 147: // get Previous record ! 148: ! 149: status = Dict_Prev( pdict, pcurrRecord ); ! 150: ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord); ! 151: break; ! 152: ! 153: case 'N': ! 154: // get Next record ! 155: ! 156: status = Dict_Next( pdict, pr ); ! 157: ItemCopy( DICT_CURR_ITEM(pdict), pr); ! 158: break; ! 159: ! 160: case 'P': ! 161: // get Previous record ! 162: ! 163: status = Dict_Prev( pdict, pr ); ! 164: ItemCopy( DICT_CURR_ITEM(pdict), pr); ! 165: break; ! 166: ! 167: case 'r': ! 168: ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord); ! 169: break; ! 170: ! 171: ! 172: case '+': ! 173: // get Next record ! 174: ! 175: status = Dict_Next( pdict, pr ); ! 176: break; ! 177: ! 178: case '-': ! 179: // get Previous record ! 180: // break; ! 181: ! 182: status = Dict_Prev( pdict, pr ); ! 183: break; ! 184: ! 185: case 'i': ! 186: // Insert <key> ! 187: ! 188: status = Dict_Insert( ! 189: pdict, ! 190: makeRecord(pr->key, pr->name) ! 191: ); ! 192: break; ! 193: ! 194: case 'I': ! 195: // Insert (<num'>,<name>) for all num': 3 < num' < num ! 196: ! 197: for (i=3; i < pr->key; i++) { ! 198: status = Dict_Insert( ! 199: pdict, ! 200: makeRecord(i, pr->name) ! 201: ); ! 202: } ! 203: break; ! 204: ! 205: case 'd': ! 206: // Delete <key> ! 207: ! 208: if (pdict != NULL) { ! 209: status = Dict_Delete(pdict, (void **)&pr); ! 210: freeRecord(pr); ! 211: pr = &r; ! 212: } ! 213: break; ! 214: ! 215: case 'x': ! 216: // Delete DICT_CURR_ITEM ! 217: ! 218: if ((pdict != NULL) && (pdict->root != NULL)) { ! 219: pr = DICT_CURR_ITEM(pdict); ! 220: status = Dict_Delete(pdict, (void **) &pr); ! 221: freeRecord(pr); ! 222: pr = &r; ! 223: } ! 224: break; ! 225: ! 226: case 'X': ! 227: // Empty the whole dictionary ! 228: ! 229: /* ! 230: while (pdict->root != NULL) { ! 231: pr = DICT_CURR_ITEM(pdict); ! 232: status = Dict_Delete(pdict, (void **)&pr); ! 233: freeRecord(pr); ! 234: pr = &r; ! 235: } ! 236: */ ! 237: ! 238: RecordTreeNodeFree((RecordTreeNode*)pdict->root); ! 239: pdict->root = NULL; ! 240: pr = &r; ! 241: break; ! 242: ! 243: case '?': ! 244: Usage_Msg(); ! 245: break; ! 246: } ! 247: if (op != '?' && op != 'q') Dict_Print(pdict, TAB_STOPS); ! 248: } ! 249: } ! 250: ! 251: Dict_Status ! 252: Dict_New_Dict( OUT Dictionary ** ppdict ) ! 253: { ! 254: static Dictionary * pdict; ! 255: ! 256: pdict = Dict_New(comp, tdSplay, printRecord); ! 257: Init_dict(pdict); ! 258: ! 259: *ppdict = pdict; ! 260: return(DICT_SUCCESS); ! 261: } ! 262: ! 263: void ! 264: Init_dict(Dictionary * dp) ! 265: { ! 266: Record* rp; ! 267: ! 268: printf ("in Init_dict\n"); ! 269: ! 270: /* ! 271: */ ! 272: rp = makeRecord(0, "jack_smith"); Dict_Insert(dp, rp); ! 273: rp = makeRecord(0, "john_doe"); Dict_Insert(dp, rp); ! 274: rp = makeRecord(1, "jean_doe"); Dict_Insert(dp, rp); ! 275: rp = makeRecord(0, "joana_smith"); Dict_Insert(dp, rp); ! 276: rp = makeRecord(1, "michael_jones"); Dict_Insert(dp, rp); ! 277: rp = makeRecord(0, "mike_jacobs"); Dict_Insert(dp, rp); ! 278: rp = makeRecord(2, "bill_jackson"); Dict_Insert(dp, rp); ! 279: rp = makeRecord(0, "jane_doe"); Dict_Insert(dp, rp); ! 280: rp = makeRecord(0, "dianne_jackson"); Dict_Insert(dp, rp); ! 281: rp = makeRecord(1, "james_doe"); Dict_Insert(dp, rp); ! 282: rp = makeRecord(1, "steve_johnson"); Dict_Insert(dp, rp); ! 283: rp = makeRecord(2, "debbie_jones"); Dict_Insert(dp, rp); ! 284: rp = makeRecord(0, "jacob_jacobson"); Dict_Insert(dp, rp); ! 285: ! 286: Dict_Print(dp, TAB_STOPS); ! 287: } ! 288: ! 289: /*************************************************************************/ ! 290: /*** Main Loop ***/ ! 291: /*************************************************************************/ ! 292: ! 293: void ! 294: main_dict () ! 295: { ! 296: Dictionary * pdict; ! 297: Dictionary ** ppdict = &pdict; ! 298: ! 299: printf ("getting a new dict\n"); ! 300: Dict_New_Dict( ppdict ); ! 301: printf ("gotten a new dict in main_dict\n"); ! 302: TestLoop(pdict); ! 303: } ! 304: ! 305: void ! 306: main(void) ! 307: { ! 308: main_dict (); ! 309: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.