Fixed bugs in LexCopyTokens() which were affecting multi-line function definitions in interactive mode

git-svn-id: http://picoc.googlecode.com/svn/trunk@183 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-03-10 02:01:12 +00:00
parent 8d76edfe4b
commit b8aedfe050
3 changed files with 10 additions and 9 deletions

3
TODO
View file

@ -1,7 +1,6 @@
TODO
Bugs:
* defining multi-line functions from interactive mode
* defining functions with no parameters (in interactive mode?)
* int fact(int i) {
if (i < 2) {
@ -10,12 +9,12 @@ Bugs:
return (i * fact(i - 1));
}
* something wrong with interactive mode after error handling - not clearing token buffer correctly?
* parsing of statements not quite right - seems to optionally want extra tokens at end
Implement:
* operator precedence
* pointer arithmetic
* casts
* fix #include
* char access/char array access/char * access
Improvements:

2
heap.c
View file

@ -99,6 +99,8 @@ void *HeapAlloc(int Size)
if (Size == 0)
return NULL;
assert(Size > 0);
if (Bucket < FREELIST_BUCKETS && FreeListBucket[Bucket] != NULL)
{ /* try to allocate from a freelist bucket first */
#ifdef DEBUG_HEAP

14
lex.c
View file

@ -613,24 +613,24 @@ void *LexCopyTokens(struct ParseState *StartParser, struct ParseState *EndParser
}
else
{ /* it's spread across multiple lines */
MemSize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes] - Pos;
MemSize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-1] - Pos;
for (ILine = InteractiveCurrentLine->Next; ILine != NULL && (EndParser->Pos < (void *)&ILine->Tokens[0] || EndParser->Pos >= (void *)&ILine->Tokens[ILine->NumBytes]); ILine = ILine->Next)
MemSize += ILine->NumBytes;
MemSize += ILine->NumBytes - 1;
assert(ILine != NULL);
MemSize += &ILine->Tokens[InteractiveCurrentLine->NumBytes] - Pos;
MemSize += EndParser->Pos - (void *)&ILine->Tokens[0];
NewTokens = VariableAlloc(StartParser, MemSize + 1, TRUE);
CopySize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes] - Pos;
CopySize = &InteractiveCurrentLine->Tokens[InteractiveCurrentLine->NumBytes-1] - Pos;
memcpy(NewTokens, Pos, CopySize);
NewTokenPos = NewTokens + CopySize;
for (ILine = InteractiveCurrentLine->Next; ILine != NULL && (EndParser->Pos < (void *)&ILine->Tokens[0] || EndParser->Pos >= (void *)&ILine->Tokens[ILine->NumBytes]); ILine = ILine->Next)
{
memcpy(NewTokenPos, &ILine->Tokens[0], ILine->NumBytes);
NewTokenPos += ILine->NumBytes;
memcpy(NewTokenPos, &ILine->Tokens[0], ILine->NumBytes-1);
NewTokenPos += ILine->NumBytes-1;
}
assert(ILine != NULL);
memcpy(NewTokenPos, &ILine->Tokens[0], &ILine->Tokens[ILine->NumBytes] - Pos);
memcpy(NewTokenPos, &ILine->Tokens[0], EndParser->Pos - (void *)&ILine->Tokens[0]);
}
}