%% 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 hexadecimal 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 hex notation. @param dptr Pointer to buffer for string. @param sz Buffer size (number of char). @param val Value to write. @param padsz Minimum number of digits, 1 for automatic choice. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4ma_write_c8_hex_unsigned( char *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp ); /** Write signed number to char string in hex notation. @param dptr Pointer to buffer for string. @param sz Buffer size (number of char). @param val Value to write. @param padsz Minimum number of digits, 1 for automatic choice. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4ma_write_c8_hex_signed( char *dptr, size_t sz, dk4_im_t val, size_t padsz, dk4_er_t *erp ); #ifdef __cplusplus } #endif %% module #include "dk4mao8h.h" #include "dk4numco.h" #include "dk4error.h" $!trace-include int dk4ma_write_c8_hex_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 occued */ int back = 0; /* Function result */ $? "+ dk4ma_write_c8_hex_unsigned" if (NULL != dptr) { *dptr = '\0'; } if (1 == padsz) { padsz = 2 * sizeof(dk4_um_t); } if ((NULL != dptr) && (0 < sz) && (padsz < sz)) { $? ". args" do { $? ". loop start" switch((int)(val % (dk4_um_t)16UL)) { case 0: { $? ". 0" if(used < sizeof(buf)) { buf[used++] = '0'; } else { err = 1; } } break; case 1: { $? ". 1" if(used < sizeof(buf)) { buf[used++] = '1'; } else { err = 1; } } break; case 2: { $? ". 2" if(used < sizeof(buf)) { buf[used++] = '2'; } else { err = 1; } } break; case 3: { $? ". 3" if(used < sizeof(buf)) { buf[used++] = '3'; } else { err = 1; } } break; case 4: { $? ". 4" if(used < sizeof(buf)) { buf[used++] = '4'; } else { err = 1; } } break; case 5: { $? ". 5" if(used < sizeof(buf)) { buf[used++] = '5'; } else { err = 1; } } break; case 6: { $? ". 6" if(used < sizeof(buf)) { buf[used++] = '6'; } else { err = 1; } } break; case 7: { $? ". 7" if(used < sizeof(buf)) { buf[used++] = '7'; } else { err = 1; } } break; case 8: { $? ". 8" if(used < sizeof(buf)) { buf[used++] = '8'; } else { err = 1; } } break; case 9: { $? ". 9" if(used < sizeof(buf)) { buf[used++] = '9'; } else { err = 1; } } break; case 10: { $? ". A" if(used < sizeof(buf)) { buf[used++] = 'A'; } else { err = 1; } } break; case 11: { $? ". B" if(used < sizeof(buf)) { buf[used++] = 'B'; } else { err = 1; } } break; case 12: { $? ". C" if(used < sizeof(buf)) { buf[used++] = 'C'; } else { err = 1; } } break; case 13: { $? ". D" if(used < sizeof(buf)) { buf[used++] = 'D'; } else { err = 1; } } break; case 14: { $? ". E" if(used < sizeof(buf)) { buf[used++] = 'E'; } else { err = 1; } } break; case 15: { $? ". F" if(used < sizeof(buf)) { buf[used++] = 'F'; } else { err = 1; } } break; } val = val / (dk4_um_t)16UL; if ((dk4_um_t)0UL == val) { cc = 0; } } while((1 == cc) && (0 == err)); if (0 == err) { $? ". no error" if (used < sz) { $? ". sufficient place" if ((0 < padsz) && (used < padsz)) { $? ". padding" 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 { $? ". no padding" for (i = 0; i < used; i++) { dptr[i] = buf[used - 1 - i]; } dptr[used] = '\0'; back = 1; } } else { $? "! insufficient place" dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { $? "! error" dk4error_set_simple_error_code(erp, DK4_E_BUG); } } else { $? "! args" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } $? "- dk4ma_write_c8_hex_unsigned %d", back return back; } int dk4ma_write_c8_hex_signed( char *dptr, size_t sz, dk4_im_t val, size_t padsz, dk4_er_t *erp ) { return (dk4ma_write_c8_hex_unsigned(dptr, sz, (dk4_um_t)val, padsz, erp)); }