%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file dk4maodo.h Octal output. */ #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 octal 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_octal_unsigned( dkChar *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp ); #ifdef __cplusplus } #endif %% module #include "dk4maodo.h" $!trace-include int dk4ma_write_octal_unsigned( dkChar *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp ) { dkChar buf[4*sizeof(dk4_um_t)+16]; /* Buffer */ size_t used = 0; /* Number of used chars */ size_t i = 0; /* Copy buffer to destination */ int cc = 1; /* Flag: Can continue */ int err = 0; /* Flag: Error occured */ int back = 0; /* Result */ if ((NULL != dptr) && (0 < sz)) { *dptr = dkT('\0'); } if (1 == padsz) { padsz = (8 * sizeof(dk4_um_t)) / 3; if (0 != ((8 * sizeof(dk4_um_t)) % 3)) { padsz++; } } if ((NULL != dptr) && (0 < sz) && (padsz < sz)) { do { switch ((int)(val % (dk4_um_t)8UL)) { case 0: { if (used < sizeof(buf)) { buf[used++] = dkT('0'); } else { err = 1; } } break; case 1: { if (used < sizeof(buf)) { buf[used++] = dkT('1'); } else { err = 1; } } break; case 2: { if (used < sizeof(buf)) { buf[used++] = dkT('2'); } else { err = 1; } } break; case 3: { if (used < sizeof(buf)) { buf[used++] = dkT('3'); } else { err = 1; } } break; case 4: { if (used < sizeof(buf)) { buf[used++] = dkT('4'); } else { err = 1; } } break; case 5: { if (used < sizeof(buf)) { buf[used++] = dkT('5'); } else { err = 1; } } break; case 6: { if (used < sizeof(buf)) { buf[used++] = dkT('6'); } else { err = 1; } } break; case 7: { if (used < sizeof(buf)) { buf[used++] = dkT('7'); } else { err = 1; } } break; } val = val / (dk4_um_t)8UL; 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] = dkT('0'); } for (i = 0; i < used; i++) { dptr[padsz - 1 -i] = buf[i]; } dptr[padsz] = dkT('\0'); back = 1; } else { for (i = 0; i < used; i++) { dptr[i] = buf[used - 1 - i]; } dptr[used] = dkT('\0'); back = 1; } } else { dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { $? "! error, bug" dk4error_set_simple_error_code(erp, DK4_E_BUG); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }