30 #include <oc_stdlib.h> 40 #define _________________________________________MACROS_SECTION_____________________________________________________________________________ 49 #define IsDigit(c) ((c) >= '0' && (c) <= '9') 50 #define IsBinary(c) ((c) >= '0' && (c) <= '1') 51 #define IsOctal(c) ((c) >= '0' && (c) <= '8') 52 #define IsHex(c) ( IsDigit(c) || ( (c) >= 'a' && (c) <= 'f' ) || ( (c) >= 'A' && (c) <= 'F' )) 55 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________ 62 #define _________________________________________TYPES_SECTION______________________________________________________________________________ 68 PointerType_SignedChar = 1 ,
69 PointerType_ShortInt = 2 ,
70 PointerType_LongInt = 3 ,
71 PointerType_LongLongInt = 4 ,
72 PointerType_IntMax = 5 ,
73 PointerType_Size = 6 ,
74 PointerType_PtrDiff = 7 ,
77 PointerType_UnsignedInt = 0 ,
78 PointerType_UnsignedChar = 1 ,
79 PointerType_UnsignedShortInt = 2 ,
80 PointerType_UnsignedLongInt = 3 ,
81 PointerType_UnsignedLongLongInt = 4 ,
82 PointerType_UnsignedIntMax = 5 ,
85 PointerType_Float = 0 ,
86 PointerType_Double = 3 ,
87 PointerType_LongDouble = 8 ,
90 PointerType_Char = 0 ,
91 PointerType_WChar = 3 ,
94 PointerType_Void = 0 ,
100 ScanfFlags_Ignored = (1<<0) ,
101 ScanfFlags_Signed = (1<<1) ,
102 ScanfFlags_Unsigned = (1<<2) ,
105 #undef _________________________________________TYPES_SECTION______________________________________________________________________________ 113 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 115 static oC_ErrorCode_t ReadInputStream(
oC_Stream_t * outStream );
116 static oC_ErrorCode_t ReadOutputStream(
oC_Stream_t * outStream );
117 static bool PutcToBuffer(
char ** outBuffer ,
char * EndPointer ,
char C );
118 static int SkipAToI(
const char ** Format );
119 static oC_ErrorCode_t PutNumber(
char ** outBuffer ,
char * EndPointer ,
long Number ,
int Base ,
int FieldWidth ,
int Precision,
int Type );
120 static oC_ErrorCode_t PutLongFloatInHex(
char ** outBuffer ,
char * EndPointer ,
unsigned char * Address,
int FieldWidth,
int Precision,
int Type );
121 static oC_ErrorCode_t PutFloatInHex(
char ** outBuffer ,
char * EndPointer ,
unsigned char * Address,
int FieldWidth,
int Precision,
int Type );
122 static oC_ErrorCode_t PutFloat(
char ** outBuffer ,
char * EndPointer ,
double Number ,
int FieldWidth,
int Precision,
char Format,
int Flags );
123 static oC_ErrorCode_t ReadNumber(
const char ** Buffer , va_list * ArgumentList ,
int Base , ScanfFlags_t Flags ,
int FieldWidth , PointerType_t PointerType );
124 static oC_ErrorCode_t ReadFloat(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth , PointerType_t PointerType );
125 static oC_ErrorCode_t ReadChar(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth );
126 static oC_ErrorCode_t ReadString(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth );
127 static oC_ErrorCode_t ReadPointer(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags );
128 static oC_ErrorCode_t ReadScanset(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth ,
const char * ScansetBegin ,
const char * ScansetEnd ,
bool ScansetInverted );
130 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 138 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________ 141 static const char *Digits =
"0123456789abcdefghijklmnopqrstuvwxyz";
142 static const char *UpperDigits =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
144 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________ 152 #define _________________________________________INTERFACE_SECTION__________________________________________________________________________ 156 oC_ErrorCode_t oC_KPrint_TurnOn(
void )
158 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
160 if(oC_AssignErrorCodeIfFalse(&errorCode,ModuleEnabledFlag ==
false , oC_ErrorCode_ModuleIsTurnedOn))
162 ModuleEnabledFlag =
true;
163 errorCode = oC_ErrorCode_None;
171 oC_ErrorCode_t oC_KPrint_TurnOff(
void )
173 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
175 if(oC_AssignErrorCodeIfFalse(&errorCode,ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
177 ModuleEnabledFlag =
false;
178 errorCode = oC_ErrorCode_None;
196 oC_ErrorCode_t
oC_KPrint_Format(
char * outBuffer , oC_UInt_t Size ,
const char * Format , va_list ArgumentList )
198 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
201 oC_AssignErrorCodeIfFalse(&errorCode, ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet) &&
202 oC_AssignErrorCodeIfFalse(&errorCode, isram(outBuffer) , oC_ErrorCode_OutputAddressNotInRAM) &&
203 oC_AssignErrorCodeIfFalse(&errorCode, isaddresscorrect(Format) , oC_ErrorCode_WrongAddress)
211 char * endPointer = &outBuffer[Size];
212 char * startBuffer= outBuffer;
214 errorCode = oC_ErrorCode_None;
216 for( ;*Format !=
'\0';Format++)
218 #define _putc(c) if(PutcToBuffer(&outBuffer,endPointer,c)==false){ errorCode = oC_ErrorCode_OutputBufferTooSmall; break; } 236 case '-': flags |= LEFT;
goto repeat;
237 case '+': flags |= PLUS;
goto repeat;
238 case ' ': flags |= SPACE;
goto repeat;
239 case '#': flags |= SPECIAL;
goto repeat;
240 case '0': flags |= ZEROPAD;
goto repeat;
250 if( IsDigit(*Format) )
252 fieldWidth = SkipAToI(&Format);
254 else if(*Format ==
'*')
257 fieldWidth = va_arg(ArgumentList,
int);
261 fieldWidth = -fieldWidth;
276 if( IsDigit(*Format) )
278 precision = SkipAToI(&Format);
280 else if (*Format ==
'*')
283 precision = va_arg(ArgumentList,
int);
297 if (*Format ==
'h' || *Format ==
'l' || *Format ==
'L')
319 while (--fieldWidth > 0)
325 _putc((
unsigned char) va_arg(ArgumentList,
int));
327 while (--fieldWidth > 0)
338 char *
string = va_arg(ArgumentList,
char *);
345 else if (isaddresscorrect(
string)==
false)
347 string =
"<string address not correct>";
348 errorCode = oC_ErrorCode_WrongAddress;
351 length = strnlen(
string, precision);
355 while (--fieldWidth >= length )
360 for (index = 0; index < length; ++index)
366 while (--fieldWidth > 0)
377 if( fieldWidth == -1 )
379 fieldWidth = 2 *
sizeof(
void *) + 2;
380 flags |= ZEROPAD | SPECIAL;
382 oC_AssignErrorCode(&errorCode , PutNumber(&outBuffer , endPointer , (
unsigned long) va_arg(ArgumentList,
void *), 16, fieldWidth, precision, flags));
389 if (qualifier ==
'l')
391 long *ip = va_arg(ArgumentList,
long *);
392 if(oC_AssignErrorCodeIfFalse(&errorCode , isram(ip) , oC_ErrorCode_OutputAddressNotInRAM))
394 *ip = (outBuffer - startBuffer);
399 int *ip = va_arg(ArgumentList,
int *);
400 if(oC_AssignErrorCodeIfFalse(&errorCode , isram(ip) , oC_ErrorCode_OutputAddressNotInRAM))
402 *ip = (outBuffer - startBuffer);
416 if (qualifier ==
'l')
418 oC_AssignErrorCode(&errorCode , PutLongFloatInHex(&outBuffer , endPointer , va_arg(ArgumentList,
unsigned char *), fieldWidth, precision, flags));
422 oC_AssignErrorCode(&errorCode , PutFloatInHex(&outBuffer , endPointer , va_arg(ArgumentList,
unsigned char *), fieldWidth, precision, flags));
455 double dnumber = va_arg(ArgumentList,
double);
456 oC_AssignErrorCode(&errorCode , PutFloat(&outBuffer , endPointer , dnumber , fieldWidth, precision, *Format, flags | SIGN));
474 unsigned long number = 0;
476 if (qualifier ==
'l')
478 number = va_arg(ArgumentList,
unsigned long);
480 else if (qualifier ==
'h')
484 number = va_arg(ArgumentList,
int);
488 number = va_arg(ArgumentList,
unsigned int);
491 else if (flags & SIGN)
493 number = va_arg(ArgumentList,
int);
497 number = va_arg(ArgumentList,
unsigned int);
499 oC_AssignErrorCode(&errorCode , PutNumber(&outBuffer , endPointer , number , base , fieldWidth , precision , flags));
500 if(errorCode == oC_ErrorCode_OutputBufferTooSmall)
514 oC_ErrorCode_t oC_KPrint_Printf(
char * outBuffer , oC_UInt_t Size , oC_IoFlags_t IoFlags ,
const char * Format , ... )
516 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
518 if(oC_AssignErrorCodeIfFalse(&errorCode,ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
520 va_list argumentList;
522 va_start(argumentList, Format);
523 errorCode = oC_KPrint_VPrintf(outBuffer,Size,IoFlags,Format,argumentList);
524 va_end(argumentList);
532 oC_ErrorCode_t oC_KPrint_VPrintf(
char * outBuffer , oC_UInt_t Size , oC_IoFlags_t IoFlags ,
const char * Format , va_list ArgumentList )
534 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
536 if(oC_AssignErrorCodeIfFalse(&errorCode,ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
540 if(!oC_ErrorOccur(errorCode) || errorCode == oC_ErrorCode_OutputBufferTooSmall )
542 errorCode = oC_KPrint_WriteToStdOut(IoFlags,outBuffer,strlen(outBuffer));
551 oC_ErrorCode_t oC_KPrint_DriverPrintf(
char * outBuffer , oC_UInt_t Size , oC_IoFlags_t IoFlags , oC_Driver_t Driver ,
const char * Format , ... )
553 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
555 if(oC_AssignErrorCodeIfFalse(&errorCode,ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
557 va_list argumentList;
560 va_start(argumentList, Format);
562 oC_AssignErrorCode( &errorCode , ReadOutputStream(&stream) ) &&
563 oC_AssignErrorCodeIfFalse(&errorCode , oC_Stream_GetDriver(stream) != Driver , oC_ErrorCode_RecursiveDriverUsage) &&
564 oC_AssignErrorCode( &errorCode ,
oC_KPrint_Format(outBuffer,Size,Format,argumentList))
567 errorCode = oC_KPrint_WriteToStdOut(IoFlags,outBuffer,Size);
569 va_end(argumentList);
577 oC_ErrorCode_t oC_KPrint_FormatScanf(
const char * Buffer ,
const char * Format , va_list ArgumentList )
579 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
582 oC_AssignErrorCodeIfFalse(&errorCode, ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet) &&
583 oC_AssignErrorCodeIfFalse(&errorCode, isaddresscorrect(Buffer) , oC_ErrorCode_WrongAddress) &&
584 oC_AssignErrorCodeIfFalse(&errorCode, isaddresscorrect(Format) , oC_ErrorCode_WrongAddress)
587 #define _getc() (*Buffer++) 588 errorCode = oC_ErrorCode_None;
591 for(;oC_ErrorOccur(errorCode) ==
false && isaddresscorrect(Format) && isaddresscorrect(Buffer) && (*Format) && (*Buffer); Format++ )
595 ScanfFlags_t flags = 0;
596 oC_UInt_t fieldWidth = 0;
597 PointerType_t pointerType= 0;
605 flags |= ScanfFlags_Ignored;
610 while(IsDigit(*Format) && isaddresscorrect(Format))
613 fieldWidth += (int)(*Format -
'0');
665 if(_getc() != *Format)
667 errorCode = oC_ErrorCode_StringNotAsExpected;
672 flags |= ScanfFlags_Signed;
675 errorCode = ReadNumber( &Buffer , &ArgumentList , base , flags , fieldWidth , pointerType );
679 flags |= ScanfFlags_Unsigned;
682 errorCode = ReadNumber( &Buffer , &ArgumentList , base , flags , fieldWidth , pointerType );
687 flags |= ScanfFlags_Signed;
690 errorCode = ReadNumber( &Buffer , &ArgumentList , base , flags , fieldWidth , pointerType );
694 flags |= ScanfFlags_Unsigned;
697 errorCode = ReadNumber( &Buffer , &ArgumentList , base , flags , fieldWidth , pointerType );
701 flags |= ScanfFlags_Unsigned;
704 errorCode = ReadNumber( &Buffer , &ArgumentList , base , flags , fieldWidth , pointerType );
711 flags |= ScanfFlags_Signed;
714 errorCode = ReadFloat( &Buffer , &ArgumentList , flags , fieldWidth , pointerType );
718 errorCode = ReadChar( &Buffer , &ArgumentList , flags , fieldWidth );
722 errorCode = ReadString( &Buffer , &ArgumentList, flags , fieldWidth );
725 errorCode = ReadPointer( &Buffer , &ArgumentList , flags );
729 bool scansetInverted =
false;
736 scansetInverted =
true;
739 const char * scansetBegin = Format;
740 const char * scansetEnd = Format;
742 while( (isaddresscorrect(scansetEnd)) && (*scansetEnd != 0) && (*scansetEnd !=
']'))
748 errorCode = ReadScanset( &Buffer , &ArgumentList , flags , fieldWidth , scansetBegin , scansetEnd , scansetInverted );
754 errorCode = oC_ErrorCode_SpecifierNotHandled;
759 else if(*Format == *Buffer)
766 errorCode = oC_ErrorCode_StringNotAsExpected;
779 oC_ErrorCode_t oC_KPrint_Scanf(
char * outBuffer , oC_UInt_t Size , oC_IoFlags_t IoFlags ,
const char * Format , ... )
781 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
783 if(oC_AssignErrorCodeIfFalse(&errorCode, ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
785 va_list argumentList;
786 va_start(argumentList,Format);
787 errorCode = oC_KPrint_VScanf(outBuffer,Size,IoFlags,Format,argumentList);
788 va_end(argumentList);
796 oC_ErrorCode_t oC_KPrint_VScanf(
char * outBuffer , oC_UInt_t Size , oC_IoFlags_t IoFlags ,
const char * Format , va_list ArgumentList )
798 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
801 oC_AssignErrorCodeIfFalse(&errorCode, ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet) &&
802 oC_AssignErrorCodeIfFalse(&errorCode, isaddresscorrect(Format) , oC_ErrorCode_WrongAddress) &&
803 oC_AssignErrorCode(&errorCode, oC_KPrint_ReadFromStdIn(IoFlags,outBuffer,Size))
806 errorCode = oC_KPrint_FormatScanf(outBuffer,Format,ArgumentList);
814 oC_ErrorCode_t oC_KPrint_WriteToStdOut( oC_IoFlags_t IoFlags ,
const char * Buffer , uint32_t Size )
816 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
818 if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet))
822 if(oC_AssignErrorCode(&errorCode , ReadOutputStream(&stream)))
824 char * eolRef = strchr(Buffer,
'\n');
825 const char newline[] =
"\r";
829 uint32_t sentBytes = 0;
832 uint32_t newLineSize = 1;
833 uint32_t bytesToSend = 0;
834 bool sendEol =
false;
836 for( uint32_t i = sentBytes ; i < Size ; i++ )
840 if(Buffer[i] ==
'\n')
848 ErrorCode( oC_Stream_Write( stream, &Buffer[sentBytes], &bytesToSend, IoFlags ))
851 || ErrorCode( oC_Stream_Write( stream, newline, &newLineSize, IoFlags ))
855 errorCode = oC_ErrorCode_None;
861 sentBytes += bytesToSend;
862 }
while( sentBytes < Size);
866 errorCode = oC_Stream_Write(stream,Buffer,&Size,IoFlags);
877 oC_ErrorCode_t oC_KPrint_ReadFromStdIn( oC_IoFlags_t IoFlags ,
char * outBuffer , uint32_t Size )
879 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
882 oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag ==
true , oC_ErrorCode_ModuleNotStartedYet) &&
883 oC_AssignErrorCodeIfFalse(&errorCode , isram(outBuffer) , oC_ErrorCode_OutputAddressNotInRAM)
888 char passwordChar=
'*';
891 oC_AssignErrorCode(&errorCode , ReadInputStream(&stream))
892 && ( !( IoFlags & oC_IoFlags_EchoWhenRead ) || oC_AssignErrorCode(&errorCode , ReadOutputStream(&outStream)) )
893 && ( !( IoFlags & oC_IoFlags_ClearRxBeforeRead ) || oC_AssignErrorCode(&errorCode , oC_Stream_ClearReadBuffer(stream)) )
896 if(IoFlags & oC_IoFlags_EchoWhenRead)
898 uint32_t bytesToRead = Size;
899 uint32_t bytesToSend = 1;
900 uint32_t readBytes = 0;
901 uint32_t sentBytes = 0;
902 char backspace = 127;
904 IoFlags &= ~oC_IoFlags_WaitForAllElements;
905 IoFlags |= oC_IoFlags_WaitForSomeElements;
907 errorCode = oC_ErrorCode_None;
909 while(readBytes < Size && !oC_ErrorOccur(errorCode))
911 if(oC_AssignErrorCode(&errorCode , oC_Stream_Read(stream,&outBuffer[readBytes],&bytesToRead,IoFlags)))
915 const char * newLine =
"\n\r";
917 outBuffer[readBytes] = 0;
918 errorCode = oC_Stream_Write(stream,newLine,&bytesToSend,oC_IoFlags_WaitForAllElements | oC_IoFlags_Default);
922 else if(outBuffer[readBytes] !=
'\033')
925 while(readBytes >= 0 && outBuffer[readBytes + bytesToRead - 1] == backspace)
927 outBuffer[readBytes] = 0;
932 errorCode = oC_Stream_Write(stream,&backspace,&bytesToSend,oC_IoFlags_WaitForAllElements | oC_IoFlags_Default);
934 outBuffer[readBytes] = 0;
943 while(sentBytes < bytesToRead && !oC_ErrorOccur(errorCode))
946 errorCode = oC_Stream_Write(stream,&passwordChar,&bytesToSend,oC_IoFlags_WaitForAllElements | oC_IoFlags_Default);
947 sentBytes += bytesToSend;
950 else if(bytesToRead > 0)
952 bytesToSend = bytesToRead;
953 errorCode = oC_Stream_Write(stream,&outBuffer[readBytes],&bytesToSend,oC_IoFlags_WaitForAllElements | oC_IoFlags_Default);
956 readBytes += bytesToRead;
957 bytesToRead = Size - readBytes;
965 errorCode = oC_Stream_Read(stream,outBuffer,&Size,IoFlags);
973 #undef _________________________________________INTERFACE_SECTION__________________________________________________________________________ 980 #define _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ 984 static oC_ErrorCode_t ReadInputStream(
oC_Stream_t * outStream )
986 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
988 oC_Process_t currentProcess = oC_ProcessMan_GetCurrentProcess();
990 if(oC_AssignErrorCodeIfFalse(&errorCode , oC_Process_IsCorrect(currentProcess) , oC_ErrorCode_ProcessNotCorrect))
992 errorCode = oC_ErrorCode_None;
993 *outStream = oC_Process_GetInputStream(currentProcess);
1001 static oC_ErrorCode_t ReadOutputStream(
oC_Stream_t * outStream )
1003 oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
1005 oC_Process_t currentProcess = oC_ProcessMan_GetCurrentProcess();
1007 if(oC_AssignErrorCodeIfFalse(&errorCode , oC_Process_IsCorrect(currentProcess) , oC_ErrorCode_ProcessNotCorrect))
1009 errorCode = oC_ErrorCode_None;
1010 *outStream = oC_Process_GetOutputStream(currentProcess);
1018 static int SkipAToI(
const char ** Format )
1022 while(IsDigit(**Format))
1024 index = index * 10 + *((*Format)++) -
'0';
1032 static bool PutcToBuffer(
char ** outBuffer ,
char * EndPointer ,
char C )
1034 bool sizeOk =
false;
1036 if(*outBuffer < EndPointer)
1048 static oC_ErrorCode_t PutNumber(
char ** outBuffer ,
char * EndPointer ,
long Number ,
int Base ,
int FieldWidth ,
int Precision,
int Type )
1050 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1051 char emptyChar =
' ';
1053 char digitBuffer[66];
1054 const char *digitPointer = Digits;
1057 #define _putc(c) if(PutcToBuffer(outBuffer,EndPointer,c)==false){ errorCode = oC_ErrorCode_OutputBufferTooSmall;} 1061 digitPointer = UpperDigits;
1069 if(oC_AssignErrorCodeIfFalse(&errorCode , (Base == 8) || (Base == 10) || (Base == 16) , oC_ErrorCode_DigitBaseNotCorrect))
1071 emptyChar = (Type & ZEROPAD) ?
'0' :
' ';
1084 else if(Type & PLUS)
1089 else if (Type & SPACE)
1104 else if( Base == 8 )
1114 digitBuffer[digitIndex++] =
'0';
1118 while( Number != 0 )
1120 digitBuffer[digitIndex++] = digitPointer[((
unsigned long) Number) % (unsigned) Base];
1121 Number = ((
unsigned long) Number) / (unsigned) Base;
1127 if( digitIndex > Precision )
1129 Precision = digitIndex;
1134 FieldWidth -= Precision;
1138 if (!(Type & (ZEROPAD | LEFT)))
1140 while(FieldWidth-- > 0)
1161 else if (Base == 16)
1172 while(FieldWidth-- > 0)
1180 while(digitIndex < Precision--)
1187 while(digitIndex-- > 0)
1189 _putc(digitBuffer[digitIndex]);
1194 while(FieldWidth-- > 0)
1206 static oC_ErrorCode_t PutLongFloatInHex(
char ** outBuffer ,
char * EndPointer ,
unsigned char * Address,
int FieldWidth,
int Precision,
int Type )
1208 #define _putc(c) if(PutcToBuffer(outBuffer,EndPointer,c)==false){ errorCode = oC_ErrorCode_OutputBufferTooSmall; } 1210 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1211 char digitsBuffer[24];
1212 const char * digits = Digits;
1218 digits = UpperDigits;
1223 for (digitIndex = 0; digitIndex < 6; digitIndex++)
1225 if (digitIndex != 0)
1227 digitsBuffer[length++] =
':';
1230 digitsBuffer[length++] = digits[Address[digitIndex] >> 4];
1231 digitsBuffer[length++] = digits[Address[digitIndex] & 0x0F];
1236 while (length < FieldWidth--)
1242 for (digitIndex = 0; digitIndex < length; ++digitIndex)
1244 _putc(digitsBuffer[digitIndex]);
1247 while(length < FieldWidth--)
1258 static oC_ErrorCode_t PutFloatInHex(
char ** outBuffer ,
char * EndPointer ,
unsigned char * Address,
int FieldWidth,
int Precision,
int Type )
1260 #define _putc(c) if(PutcToBuffer(outBuffer,EndPointer,c)==false){ errorCode = oC_ErrorCode_OutputBufferTooSmall; } 1261 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1262 char digitsBuffer[24];
1269 for( digitIndex = 0 ; digitIndex < 4 ; digitIndex++ )
1271 if( digitIndex != 0 )
1273 digitsBuffer[length++] =
'.';
1276 n = Address[digitIndex];
1280 digitsBuffer[length++] = Digits[0];
1286 digitsBuffer[length++] = Digits[n / 100];
1288 digitsBuffer[length++] = Digits[n / 10];
1293 digitsBuffer[length++] = Digits[n / 10];
1297 digitsBuffer[length++] = Digits[n];
1303 while( length < FieldWidth-- )
1308 for( digitIndex = 0 ; digitIndex < length ; ++digitIndex )
1310 _putc(digitsBuffer[digitIndex]);
1313 while( length < FieldWidth-- )
1324 static oC_ErrorCode_t PutFloat(
char ** outBuffer ,
char * EndPointer ,
double Number ,
int FieldWidth,
int Precision,
char Format,
int Flags )
1326 #define _putc(c) if(PutcToBuffer(outBuffer,EndPointer,c)==false){ errorCode = oC_ErrorCode_OutputBufferTooSmall; } 1327 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1330 int numberOfIntegerDigits = 1;
1331 int numberOfFractionalDigits = 0;
1332 int numberOfPointChars = 0;
1333 int numberOfSignChars = 0;
1334 int minimumBufferSize = 0;
1335 double integerPart = 0;
1336 double fractionalPart = 0;
1337 char integerDigits[16];
1345 emptyChar = ( Flags & ZEROPAD ) ?
'0' :
' ';
1356 else if (Flags & PLUS)
1361 else if (Flags & SPACE)
1368 integerPart = floor(Number);
1369 fractionalPart = Number - integerPart;
1376 else if( Precision == 0 && Format ==
'g' )
1381 if(Precision == 0 && !(Flags & SPECIAL))
1383 numberOfPointChars = 0;
1387 numberOfPointChars = 1;
1392 numberOfSignChars = 1;
1396 for(
double testNumber = 10 ; testNumber <= Number ; numberOfIntegerDigits++ , testNumber *= 10 );
1398 numberOfFractionalDigits = Precision;
1400 minimumBufferSize = numberOfFractionalDigits + numberOfIntegerDigits + numberOfPointChars + numberOfSignChars;
1402 while( !(Flags & LEFT) && FieldWidth > minimumBufferSize)
1413 for(
int digitIndex = (numberOfIntegerDigits-1); digitIndex >= 0 ; digitIndex-- )
1415 integerDigits[digitIndex] = Digits[((
unsigned long) integerPart) % (unsigned) 10];
1419 for(
int digitIndex = 0 ; digitIndex < numberOfIntegerDigits ; digitIndex++ )
1421 _putc(integerDigits[digitIndex]);
1424 if(numberOfPointChars)
1429 for(
int digitIndex = 0; digitIndex < numberOfFractionalDigits ; digitIndex++ )
1431 fractionalPart *= 10;
1432 char digit = Digits[((
unsigned long) fractionalPart) % (unsigned) 10];
1436 while( (Flags & LEFT) && FieldWidth > minimumBufferSize)
1448 static oC_ErrorCode_t ReadNumber(
const char ** Buffer , va_list * ArgumentList ,
int Base , ScanfFlags_t Flags ,
int FieldWidth , PointerType_t PointerType )
1450 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1452 bool filled =
false;
1453 bool negative =
false;
1455 const char * buffer = *Buffer;
1467 else if(*buffer ==
'+')
1487 else if(*buffer ==
'b')
1492 else if(IsDigit((
int)buffer[0]))
1513 if(Base != 0 && realBase != Base)
1515 errorCode = oC_ErrorCode_WrongNumberFormat;
1524 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode))
1529 if(IsBinary(*buffer))
1533 value += *buffer -
'0';
1537 errorCode = oC_ErrorCode_WrongNumberFormat;
1541 if(IsOctal(*buffer))
1545 value += *buffer -
'0';
1549 errorCode = oC_ErrorCode_WrongNumberFormat;
1553 if(IsDigit(*buffer))
1557 value += *buffer -
'0';
1561 errorCode = oC_ErrorCode_WrongNumberFormat;
1569 if(IsDigit(*buffer))
1571 value += *buffer -
'0';
1575 value += (uint64_t)tolower((
int)*buffer) - (uint64_t)(
'a') + 10;
1580 errorCode = oC_ErrorCode_WrongNumberFormat;
1584 if(!oC_ErrorOccur(errorCode))
1593 if(filled || buffer > (*Buffer))
1595 errorCode = oC_ErrorCode_None;
1604 if(!(Flags & ScanfFlags_Ignored))
1606 void * address = va_arg(*ArgumentList,
void *);
1608 if(isram(address) ==
false)
1610 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
1612 else if((Flags & ScanfFlags_Unsigned) && negative ==
true)
1614 errorCode = oC_ErrorCode_WrongNumberFormat;
1618 #define SaveValueAsType(Type) *((Type*)address) = (negative) ? (-((Type)value)) : ((Type)value) 1619 if(Flags & ScanfFlags_Signed)
1623 case PointerType_Int:
1624 SaveValueAsType(
int);
1626 case PointerType_SignedChar:
1627 SaveValueAsType(
signed char);
1629 case PointerType_ShortInt:
1630 SaveValueAsType(
short int);
1632 case PointerType_LongInt:
1633 SaveValueAsType(
long int);
1635 case PointerType_LongLongInt:
1636 SaveValueAsType(
long long int);
1638 case PointerType_IntMax:
1639 SaveValueAsType(intmax_t);
1641 case PointerType_Size:
1642 SaveValueAsType(
size_t);
1644 case PointerType_PtrDiff:
1645 SaveValueAsType(ptrdiff_t);
1655 case PointerType_Int:
1656 SaveValueAsType(
unsigned int);
1658 case PointerType_SignedChar:
1659 SaveValueAsType(
unsigned char);
1661 case PointerType_ShortInt:
1662 SaveValueAsType(
unsigned short int);
1664 case PointerType_LongInt:
1665 SaveValueAsType(
unsigned long int);
1667 case PointerType_LongLongInt:
1668 SaveValueAsType(
unsigned long long int);
1670 case PointerType_IntMax:
1671 SaveValueAsType(uintmax_t);
1673 case PointerType_Size:
1674 SaveValueAsType(
size_t);
1676 case PointerType_PtrDiff:
1677 SaveValueAsType(ptrdiff_t);
1683 #undef SaveValueAsType 1694 static oC_ErrorCode_t ReadFloat(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth , PointerType_t PointerType )
1696 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1697 long double value = 0;
1698 long double fractional= 0;
1700 const char * buffer = *Buffer;
1701 bool negative =
false;
1713 else if(*buffer ==
'+')
1724 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode))
1727 if(IsDigit(*buffer))
1730 value += (
long double)((*buffer) -
'0');
1732 else if(*buffer ==
'.')
1750 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode))
1753 if(IsDigit(*buffer))
1756 fractional += (
long double)((*buffer) -
'0');
1772 while(precision > 0)
1783 value += fractional;
1790 if(!(Flags & ScanfFlags_Ignored))
1792 void * address = va_arg(*ArgumentList,
void *);
1794 if(isram(address) ==
false)
1796 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
1800 #define SaveValueAsType(Type) *((Type*)address) = (negative) ? (-(Type)value):((Type)value) 1803 case PointerType_Float:
1804 SaveValueAsType(
float);
1806 case PointerType_Double:
1807 SaveValueAsType(
double);
1809 case PointerType_LongDouble:
1810 SaveValueAsType(
long double);
1815 #undef SaveValueAsType 1827 static oC_ErrorCode_t ReadChar(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth )
1829 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1830 const char * buffer = *Buffer;
1831 char * outPointer=
NULL;
1838 if(FieldWidth == 0 )
1848 if(!(Flags & ScanfFlags_Ignored))
1850 outPointer = va_arg(*ArgumentList,
char *);
1858 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode) && (FieldWidth > 0))
1860 if(isram(outPointer))
1862 *outPointer = *buffer;
1865 else if(outPointer !=
NULL)
1867 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
1879 static oC_ErrorCode_t ReadString(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth )
1881 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1882 const char * buffer = *Buffer;
1883 char * outPointer=
NULL;
1884 bool widthSet = FieldWidth != 0;
1891 if(!(Flags & ScanfFlags_Ignored))
1893 outPointer = va_arg(*ArgumentList,
char *);
1901 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode) && (isspace((
int)*buffer) ==
false))
1903 if(isram(outPointer))
1905 *outPointer = *buffer;
1908 else if(outPointer !=
NULL)
1910 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
1933 static oC_ErrorCode_t ReadPointer(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags )
1935 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
1936 const char * buffer = *Buffer;
1937 void ** outPointer=
NULL;
1938 oC_UInt_t value = 0;
1945 if(!(Flags & ScanfFlags_Ignored))
1947 outPointer = va_arg(*ArgumentList,
void **);
1965 errorCode = oC_ErrorCode_WrongNumberFormat;
1974 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode))
1979 if(IsDigit(*buffer))
1981 value += *buffer -
'0';
1985 value += (oC_UInt_t)((oC_UInt_t)tolower((
int)*buffer) - (oC_UInt_t)(
'a'));
1995 if(isram(outPointer))
1997 *outPointer = (
void*)value;
1999 else if(outPointer !=
NULL)
2001 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
2010 static oC_ErrorCode_t ReadScanset(
const char ** Buffer , va_list * ArgumentList , ScanfFlags_t Flags ,
int FieldWidth ,
const char * ScansetBegin ,
const char * ScansetEnd ,
bool ScansetInverted )
2012 oC_ErrorCode_t errorCode = oC_ErrorCode_None;
2013 const char * buffer = *Buffer;
2014 char * outPointer=
NULL;
2015 bool widthSet = FieldWidth != 0;
2022 if(!(Flags & ScanfFlags_Ignored))
2024 outPointer = va_arg(*ArgumentList,
char *);
2032 while(isaddresscorrect(buffer) && (*buffer != 0) && !oC_ErrorOccur(errorCode))
2034 bool signIsInScanset =
false;
2036 for(
const char * scanset = ScansetBegin ; scanset < ScansetEnd ; scanset++)
2038 if(*scanset == *buffer)
2040 signIsInScanset =
true;
2046 if(signIsInScanset == ScansetInverted)
2051 if(isram(outPointer))
2053 *outPointer = *buffer;
2056 else if(outPointer !=
NULL)
2058 errorCode = oC_ErrorCode_OutputAddressNotInRAM;
2080 #undef _________________________________________FUNCTIONS_SECTION__________________________________________________________________________ static bool oC_Bits_AreBitsSetU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are set
static bool ModuleEnabledFlag
The file with interface for process manager.
The file with interface for stream manager.
The file with interface for kernel print operations.
oC_ErrorCode_t oC_KPrint_Format(char *outBuffer, oC_UInt_t Size, const char *Format, va_list ArgumentList)
#define NULL
pointer to a zero