/** * Copyright 2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define SECUREC_INLINE_DO_MEMCPY 1 #define SECUREC_FORMAT_OUTPUT_INPUT 1 #ifdef SECUREC_FOR_WCHAR #undef SECUREC_FOR_WCHAR #endif #include "secureprintoutput.h" #define SECUREC_CHAR(x) x #define SECUREC_WRITE_MULTI_CHAR SecWriteMultiChar #define SECUREC_WRITE_STRING SecWriteString #ifndef EOF #define EOF (-1) #endif /* put a char to output */ #define SECUREC_PUTC(c, outStream) ((--(outStream)->count >= 0) ? \ (int)((unsigned int)(unsigned char)(*((outStream)->cur++) = (char)(c)) & 0xff) : EOF) /* to clear e835 */ #define SECUREC_PUTC_ZERO(outStream) ((--(outStream)->count >= 0) ? \ ((*((outStream)->cur++) = (char)('\0'))) : EOF) static void SecWriteMultiChar(char ch, int num, SecPrintfStream *f, int *pnumwritten); static void SecWriteString(const char *string, int len, SecPrintfStream *f, int *pnumwritten); #include "output.inl" /* * Wide character formatted output implementation */ int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList) { SecPrintfStream str; int retVal; str.count = (int)count; /* this count include \0 character, Must be greater than zero */ str.cur = string; retVal = SecOutputS(&str, format, argList); if ((retVal >= 0) && (SECUREC_PUTC_ZERO(&str) != EOF)) { return retVal; } else if (str.count < 0) { /* the buffer was too small; we return truncation */ string[count - 1] = '\0'; return SECUREC_PRINTF_TRUNCATE; } string[0] = '\0'; /* empty the dest strDest */ return -1; } /* * Sec write Wide character */ static void SecWriteMultiChar(char ch, int num, SecPrintfStream *f, int *pnumwritten) { int count = num; while (count-- > 0) { if (SECUREC_PUTC(ch, f) == EOF) { *pnumwritten = -1; break; } else { *pnumwritten = *pnumwritten + 1; } } } /* * Sec write string function */ static void SecWriteString(const char *string, int len, SecPrintfStream *f, int *pnumwritten) { const char *str = string; int count = len; while (count-- > 0) { if (SECUREC_PUTC(*str, f) == EOF) { *pnumwritten = -1; break; } else { *pnumwritten = *pnumwritten + 1; ++str; } } }