diff options
Diffstat (limited to 'support/dktools/dk4maowd.c')
-rw-r--r-- | support/dktools/dk4maowd.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/support/dktools/dk4maowd.c b/support/dktools/dk4maowd.c new file mode 100644 index 0000000000..d5c3504891 --- /dev/null +++ b/support/dktools/dk4maowd.c @@ -0,0 +1,187 @@ +/* + WARNING: This file was generated by dkct. + Changes you make here will be lost if dkct is run again! + You should modify the original source and run dkct on it. + Original source: dk4maowd.ctr +*/ + +/* +Copyright (C) 2015-2017, Dirk Krause + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above opyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the author nor the names of contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** @file dk4maowd.c The dk4maowd module. +*/ + + +#line 67 "dk4maowd.ctr" + + +#include "dk4maowd.h" +#include "dk4numco.h" +#include "dk4numl.h" + + + + + +#line 76 "dk4maowd.ctr" + + + +int +dk4ma_write_wc_decimal_unsigned( + wchar_t *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 */ + + if ((NULL != dptr) && (0 < sz)) { + *dptr = L'\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] = L'0'; + } + for (i = 0; i < used; i++) { + dptr[padsz - 1 - i] = buf[i]; + } + dptr[padsz] = L'\0'; + back = 1; + } else { + for (i = 0; i < used; i++) { + dptr[i] = (wchar_t)(buf[used - 1 - i]); + } + dptr[used] = L'\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_wc_decimal_signed( + wchar_t *dptr, size_t sz, dk4_im_t val, size_t padsz, dk4_er_t *erp +) +{ + int back = 0; + + if ((NULL != dptr) && (0 < sz)) { + *dptr = L'\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_wc_decimal_unsigned( + dptr, sz, (dk4_um_t)val, padsz, erp + ); + } else { + if (2 < sz) { + *(dptr++) = L'-'; sz--; + if (DK4_IM_MIN == val) { + back = dk4ma_write_wc_decimal_unsigned( + dptr, sz, + ((dk4_um_t)(DK4_IM_MAX) + (dk4_um_t)1UL), + ((0 < padsz) ? (padsz - 1) : 0), + erp + ); + } else { + back = dk4ma_write_wc_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; +} + |