diff --git a/clibrary.c b/clibrary.c index 1ee09f8..48d672d 100644 --- a/clibrary.c +++ b/clibrary.c @@ -210,7 +210,7 @@ void GenericPrintf(struct ParseState *Parser, struct Value *ReturnValue, struct struct Value *CharArray; char *Str; - if (NextArg->Typ == CharPtrType || NextArg->Typ->Base == TypePointer && NextArg->Typ->FromType->Base == TypeArray && NextArg->Typ->FromType->FromType->Base == TypeChar) + if (NextArg->Typ == CharPtrType || (NextArg->Typ->Base == TypePointer && NextArg->Typ->FromType->Base == TypeArray && NextArg->Typ->FromType->FromType->Base == TypeChar) ) { CharArray = NextArg->Val->Pointer.Segment; diff --git a/expression.c b/expression.c index 54c8dfe..8d875f1 100644 --- a/expression.c +++ b/expression.c @@ -89,13 +89,16 @@ void ExpressionStackShow(struct ExpressionStack *StackTop) switch (StackTop->p.Val->Typ->Base) { case TypeVoid: printf("void"); break; - case TypeInt: case TypeChar: printf("%d:int", StackTop->p.Val->Val->Integer); break; + case TypeInt: printf("%d:int", StackTop->p.Val->Val->Integer); break; + case TypeChar: printf("%d:char", StackTop->p.Val->Val->Character); break; case TypeFP: printf("%f:fp", StackTop->p.Val->Val->FP); break; case TypeFunction: printf("%s:function", StackTop->p.Val->Val->Identifier); break; case TypeMacro: printf("%s:macro", StackTop->p.Val->Val->Identifier); break; case TypePointer: - if (StackTop->p.Val->Typ->FromType->Base == TypeChar) - printf("\"%s\":string", (char *)StackTop->p.Val->Val->Pointer.Segment->Val->Array.Data); + if (StackTop->p.Val->Val->Pointer.Segment == NULL) + printf("ptr(NULL)"); + else if (StackTop->p.Val->Typ->FromType->Base == TypeChar) + printf("\"%s\":string", (char *)StackTop->p.Val->Val->Pointer.Segment->Val->Array.Data + StackTop->p.Val->Val->Pointer.Offset); else printf("ptr(0x%lx,%d)", (long)StackTop->p.Val->Val->Pointer.Segment, StackTop->p.Val->Val->Pointer.Offset); break; @@ -786,7 +789,7 @@ void ExpressionStackCollapse(struct ParseState *Parser, struct ExpressionStack * struct ExpressionStack *TopStackNode = *StackTop; struct ExpressionStack *TopOperatorNode; - debugf("ExpressionStackCollapse():\n"); + debugf("ExpressionStackCollapse(%d):\n", Precedence); #ifdef DEBUG_EXPRESSIONS ExpressionStackShow(*StackTop); #endif diff --git a/parse.c b/parse.c index ba6e5cd..69fe88c 100644 --- a/parse.c +++ b/parse.c @@ -257,7 +257,8 @@ enum RunMode ParseBlock(struct ParseState *Parser, int AbsorbOpenBrace, int Cond ProgramFail(Parser, "'{' expected"); if (Parser->Mode != RunModeSkip && !Condition) - { /* condition failed - skip this block instead */ + { + /* condition failed - skip this block instead */ enum RunMode OldMode = Parser->Mode; Parser->Mode = RunModeSkip; while (ParseStatement(Parser) == ParseResultOk) @@ -265,7 +266,8 @@ enum RunMode ParseBlock(struct ParseState *Parser, int AbsorbOpenBrace, int Cond Parser->Mode = OldMode; } else - { /* just run it in its current mode */ + { + /* just run it in its current mode */ while (ParseStatement(Parser) == ParseResultOk) {} } @@ -328,12 +330,21 @@ enum ParseResult ParseStatement(struct ParseState *Parser) case TokenWhile: { struct ParseState PreConditional; + + if (LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket) + ProgramFail(Parser, "'(' expected"); + ParserCopyPos(&PreConditional, Parser); do { ParserCopyPos(Parser, &PreConditional); Condition = ExpressionParseInt(Parser); - ParseBlock(Parser, TRUE, Condition); + if (LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket) + ProgramFail(Parser, "')' expected"); + + if (ParseStatementMaybeRun(Parser, Condition) != ParseResultOk) + ProgramFail(Parser, "statement expected"); + if (Parser->Mode == RunModeContinue) Parser->Mode = RunModeRun; @@ -353,15 +364,22 @@ enum ParseResult ParseStatement(struct ParseState *Parser) do { ParserCopyPos(Parser, &PreStatement); - ParseBlock(Parser, TRUE, TRUE); + if (ParseStatement(Parser) != ParseResultOk) + ProgramFail(Parser, "statement expected"); + if (Parser->Mode == RunModeContinue) Parser->Mode = RunModeRun; if (LexGetToken(Parser, NULL, TRUE) != TokenWhile) ProgramFail(Parser, "'while' expected"); + if (LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket) + ProgramFail(Parser, "'(' expected"); + Condition = ExpressionParseInt(Parser); - + if (LexGetToken(Parser, NULL, TRUE) != TokenCloseBracket) + ProgramFail(Parser, "')' expected"); + } while (Condition && Parser->Mode == RunModeRun); if (Parser->Mode == RunModeBreak) diff --git a/tests/21_char_array.c b/tests/21_char_array.c index c2ff2f2..c484f93 100644 --- a/tests/21_char_array.c +++ b/tests/21_char_array.c @@ -13,11 +13,9 @@ for (b = a; *b != 0; b++) printf("%c: %d\n", *b, *b); char destarray[10]; -char *dest; -char *src; +char *dest = &destarray[0]; +char *src = a; -dest = &destarray[0]; -src = a; while (*src != 0) *dest++ = *src++; diff --git a/tests/21_char_array.expect b/tests/21_char_array.expect new file mode 100644 index 0000000..dbc6068 --- /dev/null +++ b/tests/21_char_array.expect @@ -0,0 +1,7 @@ +hello +h: 104 +e: 101 +l: 108 +l: 108 +o: 111 +copied string is hello diff --git a/tests/Makefile b/tests/Makefile index c2f3e12..8be1c42 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -19,6 +19,7 @@ TESTS= 00_assignment.test \ 18_include.test \ 19_pointer_arithmetic.test \ 20_pointer_comparison.test \ + 21_char_array.test \ 22_floating_point.test \ 23_type_coercion.test \ 24_math_library.test \