1
Name:
Anonymous
2011-09-18 22:46
a better dictionary?
const charVal[30]={"!+-recognise these chars*/();.,?"};
struct s_chNode{int ID, extendID, byVal, branch, chleaf, unileaf;};
struct s_uniNode{int ID, extendID, byVal, branch, leaf;};
s_chNode is used as a plain old trie... Until it reaches a specified length (2-5 chars?) where the chain of chars being added becomes redundant... Eg Adding 'Abc' to 'Abc'
Then s_uniNode takes over (a First order Nest?), which allows for 'partial' prefix & suffix compression?
Each uniNode can point to a previous uniNode or Null/Empty, like chNodes, but also points to a chNode, which might be as many as five? chars at once...
4
Name:
n7ix.c
2011-09-19 9:46
//-------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//-----------------------------
const char cBlock[30] ={"!abcdefghijklmnopqrstuvwxyz?"};
struct s_chNode {int ID, depth, extVal, byVal, branch, leaf, uniLeaf;};
struct s_uniNode {int ID, extVal, byVal, branch, leaf;};
struct s_chNode *Blinks, *blink;
struct s_uniNode *Ulinks, *ulink;
int iBlinkmax=0, iBlinks=0;
int iUlinkmax=0, iUlinks=0;
//-----------------------------
void initBlink(){
Blinks = (struct s_chNode *)malloc(sizeof(struct s_chNode));
}
//-----------------------------
void initUlink(){
Ulinks = (struct s_uniNode *)malloc(sizeof(struct s_uniNode));
}
//------------------------------
void incBlink(){
blink = realloc(Blinks,((iBlinkmax+=10)+2)* sizeof(struct s_chNode));
if (blink!=NULL) Blinks = blink;
}
//---------------------------------
void incUlink(){
ulink = realloc(Ulinks,((iUlinkmax+=10)+2)* sizeof(struct s_uniNode));
if (ulink!=NULL) Ulinks = ulink;
}
//------------------
int BlinkScan(int BPreV, int BVal){
int iB, iHalt=-1;
for(iB=0;iB<iBlinks;iB++){
if(Blinks[iB].byVal == BVal)
if(Blinks[iB].extVal == BPreV) return iB;
}
return -1;
}
//-----------------------
int UlinkScan(int BPreV, int BVal){
int iB, iHalt=-1;
for(iB=0;iB<iUlinks;iB++){
if(Ulinks[iB].byVal == BVal)
if(Ulinks[iB].extVal == BPreV) return iB;
}
return -1;
}
//-----------------------
int BlinkEntry(int iD, int PreVal, int Val, int deep){
int iB=0;
iB = BlinkScan(PreVal, Val);
if (iB!=-1) return iB;
if(iBlinkmax<=iD) incBlink();
Blinks[iD].ID = iD;
Blinks[iD].depth = deep;
//Blinks[iD].Index = 0;
Blinks[iD].extVal = PreVal;
Blinks[iD].byVal = Val;
Blinks[iD].branch = 0;
Blinks[iD].leaf = 0;
iBlinks++;
//printf("added %i", iBoards-1);
return iD;
}
//------------------
int UlinkEntry(int iD, int PreVal, int Val){
int iB=0;
iB = UlinkScan(PreVal, Val);
if (iB!=-1) return iB;
if(iUlinkmax<=iD) incUlink();
Ulinks[iD].ID = iD;
//Ulinks[id].depth = deep;
//Blinks[iD].Index = 0;
Ulinks[iD].extVal = PreVal;
Ulinks[iD].byVal = Val;
Ulinks[iD].branch = 0;
Ulinks[iD].leaf = 0;
iUlinks++;
//printf("added %i", iBoards-1);
return iD;
}
//---------------------------
int scanChar(int cX){
int Geti=0, Seti=0;
while(Geti<=27){
if((int) cBlock[Geti]==cX) Seti = Geti;
Geti++;
}
return Seti;
}
//------------------------------
int main(int argc, char *argv[]){
char myStr[1000];
int i=0, j=1, k=0, l=0, m=0, loopi=0, li=0, Ui=0, n=0;
initBlink();
BlinkEntry(iBlinks, 0, 0, 0);
initUlink();
UlinkEntry(iUlinks, 0, 0);
if(argc>=2){
loopi = strlen(argv[1]);
for(li=0;li<=loopi;li++){
myStr[li] = argv[1][li];
}
} else {
printf("Usage: ex n7ix.c '-Insert string here-'\n\n");
return 0;
}
li=0;
while(((int) j!=0)+(i<=loopi)==2){
j= (int) myStr[i];
//k=scanChar(j);
k=scanChar(j);
if(li==-1){
n=k;
k=0;
}
if(k==0){
printf("::Ui %i <-", Ui);
Ui=UlinkEntry(iUlinks, Ui, m);
printf("::Ui [%i] %i::\n", Ui, m);
li=0;
l=0;
m=0;
//n=0;
if(n==0) Ui=0;
}
printf("-%c -", j);
if(n!=0){
k=n;
n=0;
}
if(k!=0){
li++;
m=BlinkEntry(iBlinks, l, k, li);
printf("%i-%c-%i-%i [%i]", l, cBlock[k], m, i, li);
if(li==3) li=-1;
l=m;
}
printf("\n");
i++;
}
return 0;
}
//--------------