shithub: femtolisp

ref: 0c0471e85605e670aab34592cd69cf3f922afd1b
dir: /llt/int2str.c/

View raw version
#include <stdlib.h>
#include "dtypes.h"

char *int2str(char *dest, size_t len, int64_t num, uint32_t base)
{
    int i = len-1, neg = 0;
    int64_t b = (int64_t)base;
    char ch;
    if (num < 0) {
        num = -num;
        neg = 1;
    }
    dest[i--] = '\0';
    while (i >= 0) {
        ch = (char)(num % b);
        if (ch < 10)
            ch += '0';
        else
            ch = ch-10+'a';
        dest[i--] = ch;
        num /= b;
        if (num == 0)
            break;
    }
    if (i >= 0 && neg)
        dest[i--] = '-';
    return &dest[i+1];
}

int isdigit_base(char c, int base)
{
    if (base < 11)
        return (c >= '0' && c < '0'+base);
    return ((c >= '0' && c <= '9') ||
            (c >= 'a' && c < 'a'+base-10) ||
            (c >= 'A' && c < 'A'+base-10));
}

/* assumes valid base, returns 1 on error, 0 if OK */
int str2int(char *str, size_t len, int64_t *res, uint32_t base)
{
    int64_t result, place;
    char digit;
    int i;

    place = 1; result = 0;
    for(i=len-1; i>=0; i--) {
        digit = str[i];
        if (!isdigit_base(digit, base))
            return 1;
        if (digit <= '9')
            digit -= '0';
        else if (digit >= 'a')
            digit = digit-'a'+10;
        else if (digit >= 'A')
            digit = digit-'A'+10;
        result += digit * place;
        place *= base;
    }
    *res = result;
    return 0;
}