⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contextdb.cpp

📁 一个RPG术语查询器
💻 CPP
字号:
#define ALLEGRO_STATICLINK
#include <allegro.h>
#ifdef _WIN32
#include <winalleg.h>
#endif


#include <iostream>
#include <fstream>
#include <string.h>

#include "context.h"
#include "types.h"
#include "entity.h"



char* TOKEN::AddToken(TOKEN *root, char *adddata,CONTEXTPROMPTFUNC bfunc, char *descriptor, int tvalue, int ttype)
{
	if(root==0 || adddata==0) return 0;
	TOKEN *working=root;
	while(1)
	{
		switch(strcmp(adddata,working->data))
		{
			case 0:
				return working->data;
				break;
			case -1:
				TOKEN *bleh = new TOKEN(adddata,bfunc,descriptor, tvalue, ttype);
				bleh->parent=working->parent;
				bleh->next=working;
				if(working->parent!=0)
				{
					working->parent->next=bleh;
					working->parent=bleh;
				}
				return bleh->data;
		}

		if(working->next==0)
		{
			working->next=new TOKEN(adddata,bfunc,descriptor, tvalue, ttype);
			working->next->parent=working;
			return working->next->data;
		}
		working=working->next;
	}
}


TOKEN* TOKEN::FindToken(TOKEN *root, char *name)
{
	if(root==0) return 0;
	TOKEN *working=root;
	while(1)
	{
		if(strcmp(name,working->data) == 0)
		{
			return working;
			
		}
		if(working->next==0)
		{
			return 0;
		}
		working=working->next;
	}
}


CONTEXTPROMPTFUNC TOKEN::FindFunction(TOKEN *root,char *identifier)
{
	if(root==0) return 0;
	TOKEN *working=root;
	while(1)
	{
		if(strcmp(identifier,working->data) == 0)
		{
			return working->bindfunction;
		}

		if(working->next==0)
		{
			return 0;
		}

		working=working->next;
	}
}


int TOKEN::SetToken(TOKEN *root, char *adddata, CONTEXTPROMPTFUNC bfunc, char *descriptor)
{
	if(root==0 || adddata==0 || descriptor==0) return -1;
	TOKEN *working=root;

	while(1)
	{
		if(strcmp(adddata,working->data) == 0)
		{
			std::cout << "Submitted changes to " << adddata << std::endl;
			working->bindfunction=bfunc;
			strcpy(working->operation,descriptor);
			return 1;
		}

		if(working->next==0)
		{
			return -1;
		}
		working=working->next;
	}
}
	
TOKEN::TOKEN(char *stringy, CONTEXTPROMPTFUNC userfunc, char *operation, int tvalue, int ttype)
{
	strcpy(TOKEN::operation,operation);
	parent=0;
	next=0;
	strcpy(data,stringy);
	bindfunction=userfunc;
	value=tvalue;
	type=ttype;
}
	
TOKEN::TOKEN()
{
	strcpy(operation,"UNDEFINED");
	parent=0;
	next=0;
	data[0]=0;
	bindfunction=0;
	value=0;
	type=0;
}
	
TOKEN::~TOKEN()
{
	if(next!=0) delete next;
}

CONTEXTPROMPTFUNC CONTEXTPROMPT::findfunc(char *dealy)
{
	if(dealy==0) return 0;
	return hash[dealy[0]]->FindFunction(hash[dealy[0]],dealy);
}
	
TOKEN* CONTEXTPROMPT::searchtoken(char *name)
{
	if(name==0) return 0;
	return hash[name[0]]->FindToken(hash[name[0]],name);
}

void CONTEXTPROMPT::setmaster(void *pmaster)
{
    master = pmaster;
}


		
int CONTEXTPROMPT::settoken(char *toadd,char *userfunction, char *descriptor)
{
	if(toadd==0 || descriptor==0 || userfunction==0)
	{
		std::cout << "INVALID DATE FOR SET" << std::endl;
		return -1;
	}
	
	CONTEXTPROMPTFUNC bleh = findfunc(userfunction);
	if(bleh==0)
	{
		std::cout << "Invalid Function" << std::endl;
		return -1;
	}
	return hash[toadd[0]]->SetToken(hash[toadd[0]],toadd,bleh,descriptor);
	std::cout << "Could not find a matching token" << std::endl;
	return -1;
}
	
void CONTEXTPROMPT::addtoken(char *toadd,CONTEXTPROMPTFUNC userfunction, char *descriptor, int tvalue, int ttype)
{
	if(toadd[0]!=0 && descriptor!=0)
	{
		hash[toadd[0]]->AddToken(hash[toadd[0]],toadd,userfunction,descriptor, tvalue, ttype);
	}
}
	
int CONTEXTPROMPT::query(char *input, char *output, int szoutput)
{
	parse(input);
	if(argc==0) return -1;
	else
	{
		CONTEXTPROMPTFUNC bleh = findfunc(argv[0]);
		if (bleh==0)
		{
			std::cout << "Bad Function" << std::endl;	
			return -1;
		}
		return bleh(argc,argv, (void *)this);
   }
}	
	
void CONTEXTPROMPT::parse(char *whole)
{
	argc=0;
	char *ripper=whole;
	
	if(ripper==0) return;
	char buffer[1024];
	int bufloc=0;
	int bufstate=STATEEMPTY;

	while(*ripper!=0)
	{
		switch(*ripper)
		{
			case ' ':

				switch(bufstate)
				{
					case STATEEMPTY:
						break;
					case STATEWORD:
						buffer[bufloc]=0;
							strcpy(argtoken[argc].text,buffer);
							argv[argc]=argtoken[argc].text;
							++argc;
							bufstate=STATEEMPTY;
							break;
						case STATEPHRASE:
							buffer[bufloc]=*ripper;
							++bufloc;
							break;
				}
				break;
			case 34:
				switch(bufstate)
				{
					case STATEEMPTY:
						bufstate=STATEPHRASE;
						bufloc=0;
						break;
					case STATEPHRASE:
						buffer[bufloc]=0;
						strcpy(argtoken[argc].text,buffer);
						argv[argc]=argtoken[argc].text;
						++argc;
						bufstate=STATEEMPTY;
						break;
					case STATEWORD:
						buffer[bufloc]=*ripper;
						++bufloc;
						break;
				}
				break;
			case 13:
			case 10:
			     break;
			default:
				switch(bufstate)
				{
					case STATEEMPTY:
						bufstate=STATEWORD;
						bufloc=0;
						buffer[bufloc]=*ripper;
						++bufloc;
						break;
					case STATEWORD:
					case STATEPHRASE:
						buffer[bufloc]=*ripper;
						++bufloc;
						break;
					
				}
				break;

		}
	
		++ripper;
	}

	if(bufstate==STATEWORD)
	{
		buffer[bufloc]=0;
		strcpy(argtoken[argc].text,buffer);
		argv[argc]=argtoken[argc].text;
		++argc;
	}
	
	if(bufstate==STATEPHRASE)
	{
		buffer[bufloc]=0;
		strcpy(argtoken[argc].text,buffer);
		argv[argc]=argtoken[argc].text;
		++argc;
	}
	
}



int CONTEXTPROMPT::save(char *xmlfile)
{
    std::ofstream xmlwrite;
    
    xmlwrite.open(xmlfile);
    if(xmlwrite)
    {
        xmlwrite << "<Context>" << std::endl << std::endl;
       	TOKEN *working;
        for(int printhash=0;printhash<256;++printhash)
        {
       		working=hash[printhash]->next;
       		while(working!=0)
			{
       			xmlwrite << " <Token name=" << (char)34 << working -> data << (char)34 << ">" << std::endl;
       			xmlwrite << "  <Description>" << working->operation << "</Description>" << std::endl;
       			xmlwrite << "  <Type>" << working->type << "</Type>" << std::endl;
       			xmlwrite << "  <Value>" << working->value << "</Value>" << std::endl;
                xmlwrite << "  <Functional>" << ((working->bindfunction!=NULL)?"Yes":"No") << "</Functional>" << std::endl;
                xmlwrite << " </Token>" << std::endl << std::endl;
      			working=working->next;
      			
      			
	      	}
        }		
        xmlwrite << "</Context>" << std::endl;
        xmlwrite.close();
    }
    else
    {
        return XML_FILENOTVALID;
    }
    return 0;
}

int CONTEXTPROMPT::load(char *xmlfile)
{


	return 0;
}






		
CONTEXTPROMPT::CONTEXTPROMPT()
{
	for(int fillhash=0;fillhash<256;++fillhash) hash[fillhash]=new TOKEN;
	argc=0;
	active=1;
	startupprompt((void *)this);
}


CONTEXTPROMPT::~CONTEXTPROMPT()
{
	for(int killhash=0;killhash<256;++killhash) delete hash[killhash];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -