1%% options 2 3copyright owner = Dirk Krause 4copyright year = 2015-xxxx 5SPDX-License-Identifier: BSD-3-Clause 6 7 8 9%% header 10 11/** @file dk4maodo.h Octal output. 12*/ 13 14#ifndef DK4CONF_H_INCLUDED 15#if DK4_BUILDING_DKTOOLS4 16#include "dk4conf.h" 17#else 18#include <dktools-4/dk4conf.h> 19#endif 20#endif 21 22#ifndef DK4TYPES_H_INCLUDED 23#if DK4_BUILDING_DKTOOLS4 24#include <libdk4base/dk4types.h> 25#else 26#include <dktools-4/dk4types.h> 27#endif 28#endif 29 30#ifndef DK4ERROR_H_INCLUDED 31#if DK4_BUILDING_DKTOOLS4 32#include <libdk4base/dk4error.h> 33#else 34#include <dktools-4/dk4error.h> 35#endif 36#endif 37 38#ifdef __cplusplus 39extern "C" { 40#endif 41 42/** Write unsigned number to char string in octal notation. 43 44 CRT on Windows: Optional. 45 @param dptr Pointer to buffer for string. 46 @param sz Buffer size (number of char). 47 @param val Value to write. 48 @param padsz Minimum number of digits, 1 for automatic choice. 49 @param erp Error report, may be NULL. 50 @return 1 on success, 0 on error. 51*/ 52int 53dk4ma_write_octal_unsigned( 54 dkChar *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp 55); 56 57#ifdef __cplusplus 58} 59#endif 60 61 62%% module 63 64#include "dk4conf.h" 65#include <libdk4maiodh/dk4maodo.h> 66 67#if DK4_HAVE_ASSERT_H 68#ifndef ASSERT_H_INCLUDED 69#include <assert.h> 70#define ASSERT_H_INCLUDED 1 71#endif 72#endif 73 74 75$!trace-include 76 77 78 79int 80dk4ma_write_octal_unsigned( 81 dkChar *dptr, size_t sz, dk4_um_t val, size_t padsz, dk4_er_t *erp 82) 83{ 84 dkChar buf[4*sizeof(dk4_um_t)+16]; /* Buffer */ 85 size_t used = 0; /* Number of used chars */ 86 size_t i = 0; /* Copy buffer to destination */ 87 int cc = 1; /* Flag: Can continue */ 88 int err = 0; /* Flag: Error occured */ 89 int back = 0; /* Result */ 90#if DK4_USE_ASSERT 91 assert(NULL != dptr); 92 assert(0 < sz); 93#endif 94 if ((NULL != dptr) && (0 < sz)) { *dptr = dkT('\0'); } 95 if (1 == padsz) { 96 padsz = (8 * sizeof(dk4_um_t)) / 3; 97 if (0 != ((8 * sizeof(dk4_um_t)) % 3)) { 98 padsz++; 99 } 100 } 101 if ((NULL != dptr) && (0 < sz) && (padsz < sz)) { 102 do { 103 switch ((int)(val % (dk4_um_t)8UL)) { 104 case 0: { 105 if (used < sizeof(buf)) { buf[used++] = dkT('0'); } else { err = 1; } 106 } break; 107 case 1: { 108 if (used < sizeof(buf)) { buf[used++] = dkT('1'); } else { err = 1; } 109 } break; 110 case 2: { 111 if (used < sizeof(buf)) { buf[used++] = dkT('2'); } else { err = 1; } 112 } break; 113 case 3: { 114 if (used < sizeof(buf)) { buf[used++] = dkT('3'); } else { err = 1; } 115 } break; 116 case 4: { 117 if (used < sizeof(buf)) { buf[used++] = dkT('4'); } else { err = 1; } 118 } break; 119 case 5: { 120 if (used < sizeof(buf)) { buf[used++] = dkT('5'); } else { err = 1; } 121 } break; 122 case 6: { 123 if (used < sizeof(buf)) { buf[used++] = dkT('6'); } else { err = 1; } 124 } break; 125 case 7: { 126 if (used < sizeof(buf)) { buf[used++] = dkT('7'); } else { err = 1; } 127 } break; 128 } 129 val = val / (dk4_um_t)8UL; 130 if ((dk4_um_t) 0UL == val) { cc = 0; } 131 } while ((1 == cc) && (0 == err)); 132 if (0 == err) { 133 if (used < sz) { 134 if ((0 < padsz) && (used < padsz)) { 135 for (i = 0; i < (padsz - used); i++) { 136 dptr[i] = dkT('0'); 137 } 138 for (i = 0; i < used; i++) { 139 dptr[padsz - 1 -i] = buf[i]; 140 } 141 dptr[padsz] = dkT('\0'); 142 back = 1; 143 } else { 144 for (i = 0; i < used; i++) { 145 dptr[i] = buf[used - 1 - i]; 146 } 147 dptr[used] = dkT('\0'); 148 back = 1; 149 } 150 } else { 151 dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); 152 } 153 } else { $? "! error, bug" 154 dk4error_set_simple_error_code(erp, DK4_E_BUG); 155 } 156 } else { 157 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); 158 } 159 return back; 160} 161 162 163