Fixed an annoying problem with entering functions interactively.

Includes a heap of debug.


git-svn-id: http://picoc.googlecode.com/svn/trunk@362 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-10-31 14:18:46 +00:00
parent 03cf6dcc90
commit ed26e6716b

90
lex.c
View file

@ -494,11 +494,11 @@ void *LexTokenise(struct LexState *Lexer, int *TokenLen)
TokenPos += ValueSize;
MemUsed += ValueSize;
}
#ifdef FANCY_ERROR_REPORTING
LastCharacterPos = Lexer->CharacterPos;
#endif
} while (Token != TokenEOF);
HeapMem = HeapAllocMem(MemUsed);
@ -511,6 +511,7 @@ void *LexTokenise(struct LexState *Lexer, int *TokenLen)
#ifdef DEBUG_LEXER
{
int Count;
printf("Tokens: ");
for (Count = 0; Count < MemUsed; Count++)
printf("%02x ", *((unsigned char *)HeapMem+Count));
printf("\n");
@ -527,6 +528,7 @@ void *LexAnalyse(const char *FileName, const char *Source, int SourceLen, int *T
{
struct LexState Lexer;
printf("LexAnalyse(\"%s\")\n", Source);
Lexer.Pos = Source;
Lexer.End = Source + SourceLen;
Lexer.Line = 1;
@ -535,6 +537,7 @@ void *LexAnalyse(const char *FileName, const char *Source, int SourceLen, int *T
Lexer.CharacterPos = 1;
Lexer.SourceText = Source;
#endif
return LexTokenise(&Lexer, TokenLen);
}
@ -558,12 +561,13 @@ enum LexToken LexGetToken(struct ParseState *Parser, struct Value **Value, int I
enum LexToken Token = TokenNone;
int ValueSize;
printf("Parser->Pos == %08lx\n", (unsigned long)Parser->Pos);
do
{
/* get the next token */
if (Parser->Pos == NULL && InteractiveHead != NULL)
Parser->Pos = InteractiveHead->Tokens;
if (Parser->FileName != StrEmpty || InteractiveHead != NULL)
{
/* skip leading newlines */
@ -581,7 +585,7 @@ enum LexToken LexGetToken(struct ParseState *Parser, struct Value **Value, int I
void *LineTokens;
int LineBytes;
struct TokenLine *LineNode;
if (InteractiveHead == NULL || (unsigned char *)Parser->Pos == &InteractiveTail->Tokens[InteractiveTail->NumBytes-TOKEN_DATA_OFFSET])
{
/* get interactive input */
@ -598,6 +602,7 @@ enum LexToken LexGetToken(struct ParseState *Parser, struct Value **Value, int I
/* put the new line at the end of the linked list of interactive lines */
LineTokens = LexAnalyse(StrEmpty, &LineBuffer[0], strlen(LineBuffer), &LineBytes);
printf("Added new line node at %08lx-%08lx with text %s\n", (unsigned long)LineTokens, (unsigned long)LineTokens+LineBytes-TOKEN_DATA_OFFSET, &LineBuffer[0]);
LineNode = VariableAlloc(Parser, sizeof(struct TokenLine), TRUE);
LineNode->Tokens = LineTokens;
LineNode->NumBytes = LineBytes;
@ -618,14 +623,21 @@ enum LexToken LexGetToken(struct ParseState *Parser, struct Value **Value, int I
else
{
/* go to the next token line */
printf("Next token line...\n");
if (Parser->Pos != &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-TOKEN_DATA_OFFSET])
{
/* scan for the line */
for (InteractiveCurrentLine = InteractiveHead; Parser->Pos != &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-TOKEN_DATA_OFFSET]; InteractiveCurrentLine = InteractiveCurrentLine->Next)
{}
{
printf("InteractiveCurrentLine = %08lx-%08lx, Pos = %08lx, NumBytes = %d\n", (unsigned long)&InteractiveCurrentLine->Tokens[0], (unsigned long)&InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-TOKEN_DATA_OFFSET], (unsigned long)Parser->Pos, InteractiveCurrentLine->NumBytes);
assert(InteractiveCurrentLine->Next != NULL);
printf(" next InteractiveCurrentLine = %08lx-%08lx, Pos = %08lx, NumBytes = %d\n", (unsigned long)&InteractiveCurrentLine->Next->Tokens[0], (unsigned long)&InteractiveCurrentLine->Next->Tokens[InteractiveCurrentLine->Next->NumBytes-TOKEN_DATA_OFFSET], (unsigned long)Parser->Pos, InteractiveCurrentLine->Next->NumBytes);
}
}
assert(InteractiveCurrentLine != NULL);
InteractiveCurrentLine = InteractiveCurrentLine->Next;
assert(InteractiveCurrentLine != NULL);
Parser->Pos = InteractiveCurrentLine->Tokens;
}
@ -679,6 +691,7 @@ enum LexToken LexGetToken(struct ParseState *Parser, struct Value **Value, int I
#ifdef DEBUG_LEXER
printf("Got token=%02x inc=%d pos=%d\n", Token, IncPos, Parser->CharacterPos);
#endif
assert(Token >= TokenNone && Token <= TokenEndOfFunction);
return Token;
}
@ -695,7 +708,7 @@ void LexToEndOfLine(struct ParseState *Parser)
}
}
/* copy the tokens from StartParser to EndParser into new memory and terminate with a TokenEOF */
/* copy the tokens from StartParser to EndParser into new memory, removing TokenEOFs and terminate with a TokenEndOfFunction */
void *LexCopyTokens(struct ParseState *StartParser, struct ParseState *EndParser)
{
int MemSize = 0;
@ -721,35 +734,88 @@ void *LexCopyTokens(struct ParseState *StartParser, struct ParseState *EndParser
if (EndParser->Pos >= StartParser->Pos && EndParser->Pos < &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes])
{
/* all on a single line */
MemSize = EndParser->Pos - StartParser->Pos;
MemSize = EndParser->Pos - StartParser->Pos - TOKEN_DATA_OFFSET;
NewTokens = VariableAlloc(StartParser, MemSize + 1, TRUE);
memcpy(NewTokens, (void *)StartParser->Pos, MemSize);
}
else
{
/* it's spread across multiple lines */
MemSize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-1] - Pos;
MemSize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-TOKEN_DATA_OFFSET] - Pos;
{
int Count;
printf("Adding up: %d bytes - ", MemSize);
for (Count = 0; Count < MemSize; Count++)
printf("%02x ", Pos[Count]);
printf("\n");
}
for (ILine = InteractiveCurrentLine->Next; ILine != NULL && (EndParser->Pos < &ILine->Tokens[0] || EndParser->Pos >= &ILine->Tokens[ILine->NumBytes]); ILine = ILine->Next)
MemSize += ILine->NumBytes - 1;
{
{
int Count;
printf("Adding up: %d bytes - ", ILine->NumBytes - TOKEN_DATA_OFFSET);
for (Count = 0; Count < ILine->NumBytes - TOKEN_DATA_OFFSET; Count++)
printf("%02x ", ILine->Tokens[Count]);
printf("\n");
}
MemSize += ILine->NumBytes - TOKEN_DATA_OFFSET;
}
assert(ILine != NULL);
MemSize += EndParser->Pos - &ILine->Tokens[0];
{
int Count;
printf("Adding up: %d bytes - ", EndParser->Pos - &ILine->Tokens[0]);
for (Count = 0; Count < EndParser->Pos - &ILine->Tokens[0]; Count++)
printf("%02x ", ILine->Tokens[Count]);
printf("\n");
}
NewTokens = VariableAlloc(StartParser, MemSize + 1, TRUE);
CopySize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-1] - Pos;
CopySize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-TOKEN_DATA_OFFSET] - Pos;
memcpy(NewTokens, Pos, CopySize);
{
int Count;
printf("Copying - ");
for (Count = 0; Count < CopySize; Count++)
printf("%02x ", Pos[Count]);
printf("\n");
}
NewTokenPos = NewTokens + CopySize;
for (ILine = InteractiveCurrentLine->Next; ILine != NULL && (EndParser->Pos < &ILine->Tokens[0] || EndParser->Pos >= &ILine->Tokens[ILine->NumBytes]); ILine = ILine->Next)
{
memcpy(NewTokenPos, &ILine->Tokens[0], ILine->NumBytes-1);
NewTokenPos += ILine->NumBytes-1;
{
int Count;
printf("Copying - ");
for (Count = 0; Count < ILine->NumBytes - TOKEN_DATA_OFFSET; Count++)
printf("%02x ", ILine->Tokens[Count]);
printf("\n");
}
memcpy(NewTokenPos, &ILine->Tokens[0], ILine->NumBytes - TOKEN_DATA_OFFSET);
NewTokenPos += ILine->NumBytes-TOKEN_DATA_OFFSET;
}
assert(ILine != NULL);
{
int Count;
printf("Copying - ");
for (Count = 0; Count < EndParser->Pos - &ILine->Tokens[0]; Count++)
printf("%02x ", ILine->Tokens[Count]);
printf("\n");
}
memcpy(NewTokenPos, &ILine->Tokens[0], EndParser->Pos - &ILine->Tokens[0]);
}
}
NewTokens[MemSize] = (unsigned char)TokenEndOfFunction;
printf("Copied tokens to address range %08lx-%08lx, size %d\n", (unsigned long)NewTokens, (unsigned long)NewTokens+MemSize+1, MemSize+1);
{
int Count;
for (Count = 0; Count <= MemSize; Count++)
printf("%02x ", NewTokens[Count]);
printf("\n");
}
return NewTokens;
}