t_bdConvFromStr.c (original) (raw)

`/* t_bdConvFromStr.c */

/*

/* Examples using the bdConvFromStr function [new in v2.7, updated in v2.7.1] */

#if _MSC_VER >= 1100 /* Detect memory leaks in MSVC++ */ #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #else #include <stdlib.h> #endif #include <stdio.h> #include <assert.h> #include "bigd.h"

int main(void) { BIGD n, ref; char *pstr; char *endptr; int haserror = 0;

/* Display the BigDigits version number */
printf("BigDigits version=%d\n", bdVersion());
if (bdVersion() < 2710) {
    printf("ERROR: require bigd version 2.7.1 or later\n");
    return 1;
}

/* Create new BIGD objects */
n = bdNew();
ref = bdNew();


/* MSVC memory leak checking stuff */

#if _MSC_VER >= 1100 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); #endif

/* Example 1 - parse a complete valid string no leading whitespace */
pstr = "123456789012345678901234567890123456789012345678901234567890";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 10);
bdPrintDecimal("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}
if (!haserror) {
    // Check against original function (which skips invalid chars)
    bdConvFromDecimal(ref, pstr);
    assert(bdIsEqual(ref, n));
}

/* Example 2 - valid input, leading whitespace and trailing invalid characters "*xyz()" */
pstr = "    123456789012345678901234567890123456789012345678901234567890*xyz()";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 0);
bdPrintDecimal("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}
if (!haserror) {
    // Check against original function (which skips invalid chars)
    bdConvFromDecimal(ref, pstr);
    assert(bdIsEqual(ref, n));
}

/* Example 3 - invalid input leading '-' is invalid */
pstr = "    -123456789012345678901234567890123456789012345678901234567890*xyz()";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 0);
bdPrintDecimal("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}
if (!haserror) {
    // Check against original function (which skips invalid chars)
    bdConvFromDecimal(ref, pstr);
    assert(bdIsEqual(ref, n));
}

/* Example 4 - parse valid base 16 digits */
pstr = "  DEADBEEFCAFEBABE01";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 16);
bdPrintHex("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}
if (!haserror) {
    // Check against original function (which skips invalid chars)
    bdConvFromHex(ref, pstr);
    assert(bdIsEqual(ref, n));
}

/* Example 5 - parse valid base 16 digits with 0x prefix and trailing 'G' */
pstr = "  0xDEADBEEFCAFEBABE01G";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 0);
bdPrintHex("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}
if (!haserror) {
    // Check against original function (which skips invalid chars)
    bdConvFromHex(ref, pstr);
    assert(bdIsEqual(ref, n));
}

/* Example 6 - parse binary number base 2, with invalid trailing char '2' */
pstr = "  1101111010101101101111101110111111001010111111101011101010111110000000012";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 2);
bdPrintHex("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}

/* Example 7 - parse binary number base 2 with 0b prefix */
pstr = "0b110111101010110110111110111011111100101011111110101110101011111000000001";
printf("\nInput: '%s'\n", pstr);
bdConvFromStr(n, pstr, &endptr, 2);
bdPrintHex("n=", n, "\n");
// Check endptr
if (endptr == pstr) {
    printf("No digits found or input not acceptable\n");
    printf("'%s'\n", pstr);
    haserror = 1;
}
else if (*endptr != '\0') {
    printf("Found trailing character '%c'\n", *endptr);
}
else {
    printf("Complete and valid conversion\n");
}


bdFree(&n);
bdFree(&ref);

return 0;

}`