Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

325 lines
9.6 KiB

/*
*************************************************************************
* Local dictionary :play" example *
* *
* Created: Dov Harel 7/1988 *
* Simplified / unified interface to dict Dov Harel 12/1990 *
* Revived to fit remote play (replay) Dov Harel 5/1/1991 *
* *
* Description: *
* This file contains a simple interactive loop of calls to the *
* dictionary. The interface is identical to the remote dictionary *
* program described in the readme file. *
*************************************************************************
*/
#define INCL_DOS
#ifdef NTENV
#include <ntos2.h>
#include <ntrtl.h>
#define printf DbgPrint
#else /* NTENV */
#include <os2def.h>
#include <bse.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#endif /* NTENV */
#include <string.h>
#include <rpc.h>
#include "dict0.h"
#include "play.h"
#include "util0.h"
#define TAB_STOPS 3
handle_t dict_bhandle;
void Usage()
{
printf("Usage : play \n\n");
exit(1);
}
/*************************************************************************/
/*** Remote Dictionary Test Loop ***/
/*************************************************************************/
void
Usage_Msg()
{
printf("Usage: \nType a single character, followed by an optional key as follows:\n\n");
printf("i <key> :: Insert <key> into dictionary\n");
printf("d <key> :: Delete <key> from dictionary\n");
printf("f <key> :: Find <key> in dictionary\n");
printf("n :: Next of local current item in dictionary\n");
printf("p :: Previous of local current item in dictionary\n");
printf("h :: Head (first item) of dictionary\n");
printf("t :: Tail (last item) of dictionary\n");
printf("? :: Print this message\n");
printf("q :: Quit\n\n");
printf("<key> is <integer> <string>");
}
/*************************************************************************/
/*** Minimal Dictionary Operations: ***/
/*** ***/
/*** Dictionary *Dict_New(Cmp_rec*, Splay*, print_rec*) ***/
/*** ***/
/*** Dict_Status Dict_Find(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Next(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Prev(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Insert(Dictionary*, Item*) ***/
/*** Dict_Status Dict_Delete(Dictionary*, Item**) ***/
/*** ***/
/*** Item* DICT_CURR_ITEM(Dict*) ***/
/*************************************************************************/
void
TestLoop( Dictionary * pdict )
{
// reconstructed from the test loop in client.c...
// local variables need substantial clean up...
char currName[80];
char name[80];
char op = 0;
char buffer[80];
Record r, currRecord;
Record *pcurrRecord = &currRecord;
Record * pnew;
Record *pr = &r;
Record * pNullRecord = NULL;
Dict_Status status;
void * pitem;
short i;
// Dictionary * pdict = *pvd;
pcurrRecord->name = currName;
pr->name = name;
// VDict_Curr_Item(*pvd, &pcurrRecord);
// Dict_Print(pdict, TAB_STOPS);
Usage_Msg();
while ( op != 'q' ) {
printf("\nnext op (i d x f n N p P h t ? q): ");
gets(buffer);
op = buffer[0];
if (op == 'i' || op == 'd' || op == 'f' ||
op == '+' || op == '-' || op == 'I')
sscanf(buffer+1, "%d %s", &pr->key, pr->name);
switch (op) {
case 'h':
// get Head of list (first record);
status = Dict_Next( pdict, NULL );
ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord);
ItemCopy( DICT_CURR_ITEM(pdict), pr);
break;
case 't':
// get Tail of list (last record)
status = Dict_Prev( pdict, NULL );
ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord);
ItemCopy( DICT_CURR_ITEM(pdict), pr);
break;
case 'f':
// Find <key>
status = Dict_Find(pdict, pr);
break;
case 'n':
// get Next record
status = Dict_Next( pdict, pcurrRecord );
ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord);
break;
case 'p':
// get Previous record
status = Dict_Prev( pdict, pcurrRecord );
ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord);
break;
case 'N':
// get Next record
status = Dict_Next( pdict, pr );
ItemCopy( DICT_CURR_ITEM(pdict), pr);
break;
case 'P':
// get Previous record
status = Dict_Prev( pdict, pr );
ItemCopy( DICT_CURR_ITEM(pdict), pr);
break;
case 'r':
ItemCopy( DICT_CURR_ITEM(pdict), pcurrRecord);
break;
case '+':
// get Next record
status = Dict_Next( pdict, pr );
break;
case '-':
// get Previous record
// break;
status = Dict_Prev( pdict, pr );
break;
case 'i':
// Insert <key>
status = Dict_Insert(
pdict,
makeRecord(pr->key, pr->name)
);
break;
case 'I':
// Insert (<num'>,<name>) for all num': 3 < num' < num
for (i=3; i < pr->key; i++) {
status = Dict_Insert(
pdict,
makeRecord(i, pr->name)
);
}
break;
case 'd':
// Delete <key>
if (pdict != NULL) {
status = Dict_Delete(pdict, &pr);
freeRecord(pr);
pr = &r;
}
break;
case 'x':
// Delete DICT_CURR_ITEM
if ((pdict != NULL) && (pdict->root != NULL)) {
pr = DICT_CURR_ITEM(pdict);
status = Dict_Delete(pdict, &pr);
freeRecord(pr);
pr = &r;
}
break;
case 'X':
// Empty the whole dictionary
/*
while (pdict->root != NULL) {
pr = DICT_CURR_ITEM(pdict);
status = Dict_Delete(pdict, &pr);
freeRecord(pr);
pr = &r;
}
*/
RecordTreeNodeFree((RecordTreeNode*)pdict->root);
pdict->root = NULL;
pr = &r;
break;
case '?':
Usage_Msg();
break;
}
if (op != '?' && op != 'q') Dict_Print(pdict, TAB_STOPS);
}
}
Dict_Status
Dict_New_Dict( OUT Dictionary ** ppdict )
{
static Dictionary * pdict;
pdict = Dict_New(comp, tdSplay, printRecord);
Init_dict(pdict);
*ppdict = pdict;
return(DICT_SUCCESS);
}
void
Init_dict(Dictionary * dp)
{
Record* rp;
printf ("in Init_dict\n");
/*
*/
rp = makeRecord(0, "donna_liu"); Dict_Insert(dp, rp);
rp = makeRecord(0, "vincent_fernandez"); Dict_Insert(dp, rp);
rp = makeRecord(1, "steve_madigan"); Dict_Insert(dp, rp);
rp = makeRecord(2, "glenn_mcelhoe"); Dict_Insert(dp, rp);
rp = makeRecord(0, "mike_montague"); Dict_Insert(dp, rp);
rp = makeRecord(2, "darryl_rubin"); Dict_Insert(dp, rp);
rp = makeRecord(1, "yaron_shamir"); Dict_Insert(dp, rp);
rp = makeRecord(0, "jim_teage"); Dict_Insert(dp, rp);
rp = makeRecord(2, "chuck_lenzmeier"); Dict_Insert(dp, rp);
rp = makeRecord(0, "dov_harel"); Dict_Insert(dp, rp);
rp = makeRecord(1, "nate_osgood"); Dict_Insert(dp, rp);
rp = makeRecord(0, "vibhas_chandorkar"); Dict_Insert(dp, rp);
rp = makeRecord(0, "todd_fredell"); Dict_Insert(dp, rp);
rp = makeRecord(0, "ryszard_kott"); Dict_Insert(dp, rp);
rp = makeRecord(0, "david_wilcox"); Dict_Insert(dp, rp);
rp = makeRecord(1, "jon_newman"); Dict_Insert(dp, rp);
rp = makeRecord(0, "steve_zeck"); Dict_Insert(dp, rp);
rp = makeRecord(2, "john_ludwig"); Dict_Insert(dp, rp);
rp = makeRecord(0, "mark_lewin"); Dict_Insert(dp, rp);
rp = makeRecord(2, "john_brannan"); Dict_Insert(dp, rp);
rp = makeRecord(0, "tom_germond"); Dict_Insert(dp, rp);
Dict_Print(dp, TAB_STOPS);
}
/*************************************************************************/
/*** Main Loop ***/
/*************************************************************************/
void
main_dict ()
{
Dictionary * pdict;
Dictionary ** ppdict = &pdict;
printf ("getting a new dict\n");
Dict_New_Dict( ppdict );
printf ("gotten a new dict in main_dict\n");
TestLoop(pdict);
}
void
main(int argc, char *argv[])
{
main_dict ();
}