Annotation of mstools/samples/rpc/dict/play.c, revision 1.1.1.4

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.