printf() now supports field widths, zero-padding and left/right justification.

git-svn-id: http://picoc.googlecode.com/svn/trunk@342 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-10-22 20:08:43 +00:00
parent 0d83e26880
commit d5811d37d5
3 changed files with 24 additions and 4 deletions

View file

@ -388,8 +388,11 @@ void ExpressionPrefixOperator(struct ParseState *Parser, struct ExpressionStack
break; break;
case TokenSizeof: case TokenSizeof:
/* XXX */ /* return the size of the argument */
ProgramFail(Parser, "not supported"); if (TopValue->Typ == &TypeType)
ExpressionPushInt(Parser, StackTop, TypeSize(TopValue->Val->Typ, TopValue->Val->Typ->ArraySize, TRUE));
else
ExpressionPushInt(Parser, StackTop, TypeSize(TopValue->Typ, TopValue->Typ->ArraySize, TRUE));
break; break;
case TokenLeftSquareBracket: case TokenLeftSquareBracket:
@ -1112,6 +1115,23 @@ int ExpressionParse(struct ParseState *Parser, struct Value **Result)
PrefixState = FALSE; PrefixState = FALSE;
ExpressionStackPushValue(Parser, &StackTop, LexValue); ExpressionStackPushValue(Parser, &StackTop, LexValue);
} }
else if (IS_TYPE_TOKEN(Token))
{
/* it's a type. push it on the stack like a value. this is used in sizeof() */
struct ValueType *Typ;
char *Identifier;
struct Value *TypeValue;
if (!PrefixState)
ProgramFail(Parser, "type not expected here");
PrefixState = FALSE;
*Parser = PreState;
TypeParse(Parser, &Typ, &Identifier);
TypeValue = VariableAllocValueFromType(Parser, &TypeType, FALSE, NULL, FALSE);
TypeValue->Val->Typ = Typ;
ExpressionStackPushValueNode(Parser, &StackTop, TypeValue);
}
else else
{ {
/* it isn't a token from an expression */ /* it isn't a token from an expression */

View file

@ -401,7 +401,7 @@ void *VariableDereferencePointer(struct ParseState *Parser, struct Value *Pointe
void LibraryInit(struct Table *GlobalTable, const char *LibraryName, struct LibraryFunction (*FuncList)[]); void LibraryInit(struct Table *GlobalTable, const char *LibraryName, struct LibraryFunction (*FuncList)[]);
void CLibraryInit(); void CLibraryInit();
void PrintCh(char OutCh, struct OutputStream *Stream); void PrintCh(char OutCh, struct OutputStream *Stream);
void PrintInt(int Num, struct OutputStream *Stream); void PrintInt(int Num, int FieldWidth, int ZeroPad, int LeftJustify, struct OutputStream *Stream);
void PrintStr(const char *Str, struct OutputStream *Stream); void PrintStr(const char *Str, struct OutputStream *Stream);
void PrintFP(double Num, struct OutputStream *Stream); void PrintFP(double Num, struct OutputStream *Stream);
void PrintType(struct ValueType *Typ, struct OutputStream *Stream); void PrintType(struct ValueType *Typ, struct OutputStream *Stream);

View file

@ -124,7 +124,7 @@ void PlatformVPrintf(const char *Format, va_list Args)
switch (*FPos) switch (*FPos)
{ {
case 's': PrintStr(va_arg(Args, char *), &CStdOut); break; case 's': PrintStr(va_arg(Args, char *), &CStdOut); break;
case 'd': PrintInt(va_arg(Args, int), &CStdOut); break; case 'd': PrintInt(va_arg(Args, int), 0, FALSE, FALSE, &CStdOut); break;
case 'c': PrintCh(va_arg(Args, int), &CStdOut); break; case 'c': PrintCh(va_arg(Args, int), &CStdOut); break;
case 't': PrintType(va_arg(Args, struct ValueType *), &CStdOut); break; case 't': PrintType(va_arg(Args, struct ValueType *), &CStdOut); break;
#ifndef NO_FP #ifndef NO_FP