From 885f8cc426a8840ae61023b75f3f0e4a1e268082 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Mon, 05 Jul 2004 01:53:09 +0000 Subject: initial commit into svn repository git-svn-id: http://svn.klever.net/kin/kinsole/trunk@1 fe716a7a-6dde-0310-88d9-d003556173a8 --- (limited to 'NEW-ENVIRON.cpp') diff --git a/NEW-ENVIRON.cpp b/NEW-ENVIRON.cpp new file mode 100644 index 0000000..370ff73 --- a/dev/null +++ b/NEW-ENVIRON.cpp @@ -0,0 +1,272 @@ + +enum _NESB { + nesbSend = 1, + nesbIs = 0, + nesbInfo = 2, + + nesbVar = 0, + nesbValue = 1, + nesbESC = 2, + nesbUserVar = 3, + + nesbNothing = 256 +}; + +struct _envariable { + BYTE type; + char* name; + char* value; + _envariable() : type(0), name(NULL), value(NULL) {} + ~_envariable() { ItIsNot(); } + void ItIsNot() { + if(name) delete name; + if(value) delete value; + } + BOOL ItIs(BYTE t,LPCTSTR n,LPCTSTR v) { + ItIsNot(); + name = new CHAR[strlen(n)+1]; strcpy(name,n); + value = new CHAR[strlen(v)+1]; strcpy(value,v); + type=t; + return TRUE; + } + int TransmitSize() { + char* v = value; + for(int rv=0;*v;v++,rv++){ + switch(*v){ + case nesbVar: + case nesbValue: + case nesbUserVar: + case nesbESC: + rv++; + break; + } + } + for(v=name;*v;v++,rv++){ + switch(*v){ + case nesbVar: + case nesbValue: + case nesbUserVar: + case nesbESC: + rv++; + break; + } + } + return rv+2; // VAR/VAL + } + int Paste(CHAR* data) { + int rv=0; + ASSERT(type==nesbVar || type==nesbUserVar); + data[rv++]=type; + for(CHAR* v=name;*v;v++){ + switch(*v){ + case nesbVar: + case nesbValue: + case nesbUserVar: + case nesbESC: + data[rv++]=nesbESC; + default: + data[rv++]=*v; + } + } + data[rv++]=nesbValue; + for(v=value;*v;v++){ + switch(*v){ + case nesbVar: + case nesbValue: + case nesbUserVar: + case nesbESC: + data[rv++]=nesbESC; + default: + data[rv++]=*v; + } + } + return rv; + } + BOOL IsIt(CHAR* n,int l) { + BOOL bESC = FALSE; + CHAR* nPtr = name; + for(int tmp=0;tmp=nEnvarsAllocated){ + ASSERT(nEnvars==nEnvarsAllocated); + _envariable* ne = new _envariable[nEnvarsAllocated+ENVGROW]; + ASSERT(ne); + if(nEnvarsAllocated){ + memmove(ne,Envars,sizeof(_envariable)*nEnvarsAllocated); + delete Envars; + } + Envars=ne; + nEnvarsAllocated+=ENVGROW; + } + return Envars[nEnvars++].ItIs(type,name,value); +} +BOOL CleanEnvars() +{ + if(Envars){ + ASSERT(nEnvarsAllocated); + delete[] Envars; + } + return TRUE; +} + +BOOL newenvironOnDont() +{ + TRACE0("DONT NEW-ENVIRON\n"); + return TRUE; +} +BOOL newenvironOnDo() +{ + TRACE0("DO NEW-ENVIRON\n"); + return (Envars && nEnvars)?TRUE:FALSE; +} +BOOL newenvironOnSB(LPBYTE data,UINT size) +{ + if(!size) + return FALSE; + if(data[0]!=nesbSend) + return FALSE; + if(!(Envars && nEnvars)){ + BYTE no = nesbIs; + return SubNegotiate(toNewEnviron,&no,1); + } +UINT totalSize = 1; // IS byte + if(size>1 ){ + int type = 0; + int name = 0; + BOOL bESC = FALSE; + for(UINT tmp=1;tmp<=size;tmp++){ + switch((tmp==size)?nesbNothing:(UINT)data[tmp]){ + case nesbESC: + bESC=TRUE; + break; + case nesbVar: + case nesbUserVar: + case nesbNothing: + if(!bESC){ + if(type){ + if(name){ + _envariable* ev = FindEnvar(data[type],(CHAR*)&data[name],tmp-name); + if(ev){ + totalSize+=ev->TransmitSize(); + } + }else{ + for(int tmp=0;tmpPaste(&d[ptr]); + } + }else{ + for(int tmp=0;tmp