%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file Convert dk4_um_t / dk4_im_t to 8 bit character strings in decimal notation. */ #ifndef DK4CONF_H_INCLUDED #include "dk4conf.h" #endif #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef DK4ERROR_H_INCLUDED #include "dk4error.h" #endif #ifdef __cplusplus extern "C" { #endif /** Write unsigned number to char string in decimal notation. @param dptr Pointer to buffer for string. @param sz Buffer size (number of char). @param val Value to write. @param padsz Size for padding. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4ma_write_c8_decimal_unsigned( char *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp ); /** Write signed number to char string in decimal notation. @param dptr Pointer to buffer for string. @param sz Buffer size (number of char). @param val Value to write. @param padsz Size for padding. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4ma_write_c8_decimal_signed( char *dptr, size_t sz, dk4_im_t val, size_t padsz, dk4_er_t *erp ); #ifdef __cplusplus } #endif %% module #include "dk4mao8d.h" #include "dk4numco.h" #include "dk4error.h" #include "dk4numl.h" $!trace-include int dk4ma_write_c8_decimal_unsigned( char *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp ) { char buf[4*sizeof(dk4_um_t) + 16]; /* Buffer */ size_t used = 0; /* Number of used characters */ size_t i = 0; /* Copy buffer to destination */ int cc = 1; /* Flag: Can continue */ int err = 0; /* Flag: Error occured */ int back = 0; /* Function result */ if ((NULL != dptr) && (0 < sz)) { *dptr = '\0'; } if (1 == padsz) { padsz = dk4numlength(sizeof(dk4_um_t), 0); } if ((NULL != dptr) && (0 < sz) && (padsz < sz)) { do { switch((int)(val % (dk4_um_t)10UL)) { case 0: { if(used < sizeof(buf)) { buf[used++] = '0'; } else { err = 1; } } break; case 1: { if(used < sizeof(buf)) { buf[used++] = '1'; } else { err = 1; } } break; case 2: { if(used < sizeof(buf)) { buf[used++] = '2'; } else { err = 1; } } break; case 3: { if(used < sizeof(buf)) { buf[used++] = '3'; } else { err = 1; } } break; case 4: { if(used < sizeof(buf)) { buf[used++] = '4'; } else { err = 1; } } break; case 5: { if(used < sizeof(buf)) { buf[used++] = '5'; } else { err = 1; } } break; case 6: { if(used < sizeof(buf)) { buf[used++] = '6'; } else { err = 1; } } break; case 7: { if(used < sizeof(buf)) { buf[used++] = '7'; } else { err = 1; } } break; case 8: { if(used < sizeof(buf)) { buf[used++] = '8'; } else { err = 1; } } break; case 9: { if(used < sizeof(buf)) { buf[used++] = '9'; } else { err = 1; } } break; } val = val / (dk4_um_t)10UL; if ((dk4_um_t)0UL == val) { cc = 0; } } while((1 == cc) && (0 == err)); if (0 == err) { if (used < sz) { if ((0 < padsz) && (used < padsz)) { for (i = 0; i < (padsz - used); i++) { dptr[i] = '0'; } for (i = 0; i < used; i++) { dptr[padsz - 1 - i] = buf[i]; } dptr[padsz] = '\0'; back = 1; } else { for (i = 0; i < used; i++) { dptr[i] = buf[used - 1 - i]; } dptr[used] = '\0'; back = 1; } } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { dk4error_set_simple_error_code(erp, DK4_E_BUG); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4ma_write_c8_decimal_signed( char *dptr, size_t sz, dk4_im_t val, size_t padsz, dk4_er_t *erp ) { int back = 0; if ((NULL != dptr) && (0 < sz)) { *dptr = '\0'; } if (1 == padsz) { padsz = dk4numlength(sizeof(dk4_im_t), 1); } if ((NULL != dptr) && (0 < sz) && (padsz < sz)) { if ((dk4_im_t)0L <= val) { back = dk4ma_write_c8_decimal_unsigned( dptr, sz, (dk4_um_t)val, padsz, erp ); } else { if (2 < sz) { *(dptr++) = '-'; sz--; if (DK4_IM_MIN == val) { back = dk4ma_write_c8_decimal_unsigned( dptr, sz, ((dk4_um_t)(DK4_IM_MAX) + (dk4_um_t)1UL), ((0 < padsz) ? (padsz - 1) : (0)), erp ); } else { back = dk4ma_write_c8_decimal_unsigned( dptr, sz, (dk4_um_t)((dk4_im_t)0L - val), ((0 < padsz) ? (padsz - 1) : 0), erp ); } } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }