/** ** @file cvtoct.c ** ** @author Numerous CSCI-452 classes ** ** @brief C implementations of common library functions */ #ifndef CVTOCT_SRC_INC #define CVTOCT_SRC_INC #include #include /** ** cvtoct(buf,value) ** ** convert a 32-bit unsigned value into a mininal-length (up to ** 11-character) NUL-terminated character string ** ** @param buf Destination buffer ** @param value Value to convert ** ** @return The number of characters placed into the buffer ** (not including the NUL) ** ** NOTE: assumes buf is large enough to hold the resulting string */ int cvtoct(char *buf, uint32_t value) { int i; int chars_stored = 0; char *bp = buf; uint32_t val; val = (value & 0xc0000000); val >>= 30; for (i = 0; i < 11; i += 1) { if (i == 10 || val != 0 || chars_stored) { chars_stored = 1; val &= 0x7; *bp++ = val + '0'; } value <<= 3; val = (value & 0xe0000000); val >>= 29; } *bp = '\0'; return bp - buf; } #endif