Skip to content

StrClear

StrClear

Description

Set string length to 0.

Parameters

Name Direction Description
vec in,out Str to be cleared.

Failure

NULL

Usage example (Cross-references)

Usage examples (Cross-references)
            // Memory operations
            case STR_CLEAR : {
                StrClear(str);
                break;
            }
        ValidateStr(str);
    
        StrClear(str);
    
        va_list args;
        }
    
        StrClear(str);
    
        // Add prefix if requested
        }
    
        StrClear(str);
    
        // Handle special cases
        if (key->length == 0) {
            LOG_ERROR("Expected config key");
            StrClear(key);
            return saved_si;
        }
                    if (!StrIterRemainingLength(&si)) {
                        LOG_ERROR("Unexpected end of quoted config value");
                        StrClear(value);
                        return saved_si;
                    }
    
            LOG_ERROR("Missing closing quote in config value");
            StrClear(value);
            return saved_si;
        }
        if (StrIterPeek(&si) != '=' && StrIterPeek(&si) != ':') {
            LOG_ERROR("Expected '=' or ':' after config key");
            StrClear(key);
            StrClear(value);
            return saved_si;
            LOG_ERROR("Expected '=' or ':' after config key");
            StrClear(key);
            StrClear(value);
            return saved_si;
        }
    
        if (si.pos == saved_si.pos) {
            StrClear(key);
            StrClear(value);
            return saved_si;
        if (si.pos == saved_si.pos) {
            StrClear(key);
            StrClear(value);
            return saved_si;
        }
        } else if (!kvconfig_is_line_end(StrIterPeek(&si))) {
            LOG_ERROR("Unexpected trailing characters after config value");
            StrClear(key);
            StrClear(value);
            return saved_si;
            LOG_ERROR("Unexpected trailing characters after config value");
            StrClear(key);
            StrClear(value);
            return saved_si;
        } else {
                        if (!StrIterRemainingLength(&si)) {
                            LOG_ERROR("Unexpected end of string.");
                            StrClear(str);
                            return saved_si;
                        }
                            default :
                                LOG_ERROR("Invalid JSON object key string.");
                                StrClear(str);
                                return saved_si;
                        }
        });
    
        StrClear(&code);
    
        // Use a temporary variable for enum name
        success      = success && (StrCmp(&s, &expected) == 0);
        StrDeinit(&expected);
        StrClear(&s);
    
        // Test quoted string reading
        success      = success && (StrCmp(&name, &expected) == 0);
        StrDeinit(&expected);
        StrClear(&name);
    
        // Test with different order
        StrWriteFmt(&output, "");
        success = success && (output.length == 0);
        StrClear(&output);
    
        // Test literal text
        StrWriteFmt(&output, "Hello, world!");
        success = success && (ZstrCompare(output.data, "Hello, world!") == 0);
        StrClear(&output);
    
        // Test escaped braces
        StrWriteFmt(&output, "{{Hello}}");
        success = success && (ZstrCompare(output.data, "{Hello}") == 0);
        StrClear(&output);
    
        // Test double escaped braces
        StrWriteFmt(&output, "{}", str);
        success = success && (ZstrCompare(output.data, "Hello") == 0);
        StrClear(&output);
    
        // Test empty string
        StrWriteFmt(&output, "{}", empty);
        success = success && (output.length == 0);
        StrClear(&output);
    
        // Test string with width and alignment
        StrWriteFmt(&output, "{>10}", str);
        success = success && (ZstrCompare(output.data, "     Hello") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{<10}", str);
        StrWriteFmt(&output, "{<10}", str);
        success = success && (ZstrCompare(output.data, "Hello     ") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{^10}", str);
        StrWriteFmt(&output, "{^10}", str);
        success = success && (ZstrCompare(output.data, "  Hello   ") == 0);
        StrClear(&output);
    
        // Test Str object
        StrWriteFmt(&output, "{}", i8_val);
        success = success && (ZstrCompare(output.data, "-42") == 0);
        StrClear(&output);
    
        i16 i16_val = -1234;
        StrWriteFmt(&output, "{}", i16_val);
        success = success && (ZstrCompare(output.data, "-1234") == 0);
        StrClear(&output);
    
        i32 i32_val = -123456;
        StrWriteFmt(&output, "{}", i32_val);
        success = success && (ZstrCompare(output.data, "-123456") == 0);
        StrClear(&output);
    
        i64 i64_val = -1234567890LL;
        StrWriteFmt(&output, "{}", i64_val);
        success = success && (ZstrCompare(output.data, "-1234567890") == 0);
        StrClear(&output);
    
        // Test unsigned integers
        StrWriteFmt(&output, "{}", u8_val);
        success = success && (ZstrCompare(output.data, "42") == 0);
        StrClear(&output);
    
        u16 u16_val = 1234;
        StrWriteFmt(&output, "{}", u16_val);
        success = success && (ZstrCompare(output.data, "1234") == 0);
        StrClear(&output);
    
        u32 u32_val = 123456;
        StrWriteFmt(&output, "{}", u32_val);
        success = success && (ZstrCompare(output.data, "123456") == 0);
        StrClear(&output);
    
        u64 u64_val = 1234567890ULL;
        StrWriteFmt(&output, "{}", u64_val);
        success = success && (ZstrCompare(output.data, "1234567890") == 0);
        StrClear(&output);
    
        // Test edge cases
        StrWriteFmt(&output, "{}", i8_max);
        success = success && (ZstrCompare(output.data, "127") == 0);
        StrClear(&output);
    
        i8 i8_min = -128;
        StrWriteFmt(&output, "{}", i8_min);
        success = success && (ZstrCompare(output.data, "-128") == 0);
        StrClear(&output);
    
        u8 u8_max = 255;
        StrWriteFmt(&output, "{}", u8_max);
        success = success && (ZstrCompare(output.data, "255") == 0);
        StrClear(&output);
    
        u8 u8_min = 0;
        StrWriteFmt(&output, "{x}", val);
        success = success && (ZstrCompare(output.data, "0xdeadbeef") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{X}", val);
        StrWriteFmt(&output, "{}", f32_val);
        success = success && (ZstrCompare(output.data, "3.141590") == 0);
        StrClear(&output);
    
        f64 f64_val = 2.71828;
        StrWriteFmt(&output, "{.2}", val);
        success = success && (ZstrCompare(output.data, "3.14") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{.0}", val);
        StrWriteFmt(&output, "{.0}", val);
        success = success && (ZstrCompare(output.data, "3") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{.10}", val);
        StrWriteFmt(&output, "{}", pos_inf);
        success = success && (ZstrCompare(output.data, "inf") == 0);
        StrClear(&output);
    
        f64 neg_inf = -INFINITY;
        StrWriteFmt(&output, "{}", neg_inf);
        success = success && (ZstrCompare(output.data, "-inf") == 0);
        StrClear(&output);
    
        // Test NaN
        StrWriteFmt(&output, "{5}", val);
        success = success && (ZstrCompare(output.data, "   42") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{<5}", val);
        StrWriteFmt(&output, "{<5}", val);
        success = success && (ZstrCompare(output.data, "42   ") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{^5}", val);
        StrWriteFmt(&output, "{^5}", val);
        success = success && (ZstrCompare(output.data, " 42  ") == 0);
        StrClear(&output);
    
        // Test with strings
        StrWriteFmt(&output, "{5}", str);
        success = success && (ZstrCompare(output.data, "  abc") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{<5}", str);
        StrWriteFmt(&output, "{<5}", str);
        success = success && (ZstrCompare(output.data, "abc  ") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{^5}", str);
        StrWriteFmt(&output, "{} {} {}", hello, num, pi);
        success = success && (ZstrCompare(output.data, "Hello 42 3.140000") == 0);
        StrClear(&output);
    
        // Instead of using positional arguments, we'll just reorder the arguments themselves
        StrWriteFmt(&output, "{c}", mixed_case);
        success = success && (ZstrCompare(output.data, "MiXeD CaSe") == 0);
        StrClear(&output);
    
        // Test mixed case string with :a (lowercase)
        StrWriteFmt(&output, "{a}", mixed_case);
        success = success && (ZstrCompare(output.data, "mixed case") == 0);
        StrClear(&output);
    
        // Test mixed case string with :A (uppercase)
        StrWriteFmt(&output, "{A}", mixed_case);
        success = success && (ZstrCompare(output.data, "MIXED CASE") == 0);
        StrClear(&output);
    
        // Test with Str object
        StrWriteFmt(&output, "{c}", s);
        success = success && (ZstrCompare(output.data, "MiXeD CaSe") == 0);
        StrClear(&output);
    
        // Test with :a (lowercase)
        StrWriteFmt(&output, "{a}", s);
        success = success && (ZstrCompare(output.data, "mixed case") == 0);
        StrClear(&output);
    
        // Test with :A (uppercase)
        StrWriteFmt(&output, "{A}", s);
        success = success && (ZstrCompare(output.data, "MIXED CASE") == 0);
        StrClear(&output);
    
        // Test with character values (u8)
        StrWriteFmt(&output, "{c}", upper_char);
        success = success && (ZstrCompare(output.data, "M") == 0);
        StrClear(&output);
    
        // Test uppercase char with :a (lowercase)
        StrWriteFmt(&output, "{a}", upper_char);
        success = success && (ZstrCompare(output.data, "m") == 0);
        StrClear(&output);
    
        // Test lowercase char with :A (uppercase)
        StrWriteFmt(&output, "{A}", lower_char);
        success = success && (ZstrCompare(output.data, "M") == 0);
        StrClear(&output);
    
        // Test with u16 (containing ASCII values)
        StrWriteFmt(&output, "{c}", u16_value);
        success = success && (output.length == 2 && output.data[0] == 'A' && output.data[1] == 'B');
        StrClear(&output);
    
        // Test u16 with :a (lowercase)
        StrWriteFmt(&output, "{a}", u16_value);
        success = success && (output.length == 2 && output.data[0] == 'a' && output.data[1] == 'b');
        StrClear(&output);
    
        // Test u16 with :A (uppercase)
        StrWriteFmt(&output, "{A}", u16_value);
        success = success && (output.length == 2 && output.data[0] == 'A' && output.data[1] == 'B');
        StrClear(&output);
    
        // Test with i16 (containing ASCII values)
        StrWriteFmt(&output, "{c}", i16_value);
        success = success && (output.length == 2 && output.data[0] == 'C' && output.data[1] == 'd');
        StrClear(&output);
    
        // Test i16 with :a (lowercase)
        StrWriteFmt(&output, "{a}", i16_value);
        success = success && (output.length == 2 && output.data[0] == 'c' && output.data[1] == 'd');
        StrClear(&output);
    
        // Test i16 with :A (uppercase)
        StrWriteFmt(&output, "{A}", i16_value);
        success = success && (output.length == 2 && output.data[0] == 'C' && output.data[1] == 'D');
        StrClear(&output);
    
        // Test with u32 (containing ASCII values)
        success = success && (output.length == 4 && output.data[0] == 'E' && output.data[1] == 'f' &&
                              output.data[2] == 'G' && output.data[3] == 'h');
        StrClear(&output);
    
        // Test u32 with :a (lowercase)
        success = success && (output.length == 4 && output.data[0] == 'e' && output.data[1] == 'f' &&
                              output.data[2] == 'g' && output.data[3] == 'h');
        StrClear(&output);
    
        // Test u32 with :A (uppercase)
        success = success && (output.length == 4 && output.data[0] == 'E' && output.data[1] == 'F' &&
                              output.data[2] == 'G' && output.data[3] == 'H');
        StrClear(&output);
    
        // Test with i32 (containing ASCII values)
        success = success && (output.length == 4 && output.data[0] == 'I' && output.data[1] == 'j' &&
                              output.data[2] == 'K' && output.data[3] == 'l');
        StrClear(&output);
    
        // Test i32 with :a (lowercase)
        success = success && (output.length == 4 && output.data[0] == 'i' && output.data[1] == 'j' &&
                              output.data[2] == 'k' && output.data[3] == 'l');
        StrClear(&output);
    
        // Test i32 with :A (uppercase)
        success = success && (output.length == 4 && output.data[0] == 'I' && output.data[1] == 'J' &&
                              output.data[2] == 'K' && output.data[3] == 'L');
        StrClear(&output);
    
        // Test with u64 (containing ASCII values)
                              output.data[2] == 'O' && output.data[3] == 'p' && output.data[4] == 'Q' &&
                              output.data[5] == 'r' && output.data[6] == 'S' && output.data[7] == 't');
        StrClear(&output);
    
        // Test u64 with :a (lowercase)
                              output.data[2] == 'o' && output.data[3] == 'p' && output.data[4] == 'q' &&
                              output.data[5] == 'r' && output.data[6] == 's' && output.data[7] == 't');
        StrClear(&output);
    
        // Test u64 with :A (uppercase)
                              output.data[2] == 'O' && output.data[3] == 'P' && output.data[4] == 'Q' &&
                              output.data[5] == 'R' && output.data[6] == 'S' && output.data[7] == 'T');
        StrClear(&output);
    
        // Test with i64 (containing ASCII values)
                              output.data[2] == 'W' && output.data[3] == 'x' && output.data[4] == 'Y' &&
                              output.data[5] == 'z' && output.data[6] == '1' && output.data[7] == '2');
        StrClear(&output);
    
        // Test i64 with :a (lowercase)
                              output.data[2] == 'w' && output.data[3] == 'x' && output.data[4] == 'y' &&
                              output.data[5] == 'z' && output.data[6] == '1' && output.data[7] == '2');
        StrClear(&output);
    
        // Test i64 with :A (uppercase)
        StrWriteFmt(&output, "{}", bv1);
        success = success && (ZstrCompare(output.data, "10110") == 0);
        StrClear(&output);
    
        // Test 2: Empty BitVec
        StrWriteFmt(&output, "{}", bv_empty);
        success = success && (output.length == 0);
        StrClear(&output);
    
        // Test 3: Hex formatting
        StrWriteFmt(&output, "{x}", bv2);
        success = success && (ZstrCompare(output.data, "0xabcd") == 0);
        StrClear(&output);
    
        // Test 4: Uppercase hex formatting
        StrWriteFmt(&output, "{X}", bv2);
        success = success && (ZstrCompare(output.data, "0xABCD") == 0);
        StrClear(&output);
    
        // Test 5: Octal formatting
        StrWriteFmt(&output, "{o}", bv3);
        success = success && (ZstrCompare(output.data, "0o755") == 0);
        StrClear(&output);
    
        // Test 6: Width and alignment
        StrWriteFmt(&output, "{>10}", bv1);
        success = success && (ZstrCompare(output.data, "     10110") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{<10}", bv1);
        StrWriteFmt(&output, "{<10}", bv1);
        success = success && (ZstrCompare(output.data, "10110     ") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{^10}", bv1);
        StrWriteFmt(&output, "{^10}", bv1);
        success = success && (ZstrCompare(output.data, "  10110   ") == 0);
        StrClear(&output);
    
        // Test 7: Zero value
        StrWriteFmt(&output, "{x}", bv_zero);
        success = success && (ZstrCompare(output.data, "0x0") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{o}", bv_zero);
        StrWriteFmt(&output, "{o}", bv_zero);
        success = success && (ZstrCompare(output.data, "0o0") == 0);
        StrClear(&output);
    
        // Cleanup
        StrWriteFmt(&output, "{}", big_dec);
        success = success && (ZstrCompare(output.data, "123456789012345678901234567890") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{x}", hex_val);
        StrWriteFmt(&output, "{x}", hex_val);
        success = success && (ZstrCompare(output.data, "deadbeefcafebabe1234") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{X}", hex_val);
        StrWriteFmt(&output, "{X}", hex_val);
        success = success && (ZstrCompare(output.data, "DEADBEEFCAFEBABE1234") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{b}", bin_val);
        StrWriteFmt(&output, "{b}", bin_val);
        success = success && (ZstrCompare(output.data, "10100011") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{o}", oct_val);
        StrWriteFmt(&output, "{o}", oct_val);
        success = success && (ZstrCompare(output.data, "755") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{>34}", big_dec);
        StrWriteFmt(&output, "{}", exact);
        success = success && (ZstrCompare(output.data, "1234567890.012345") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{e}", sci);
        StrWriteFmt(&output, "{e}", sci);
        success = success && (ZstrCompare(output.data, "1.234567e+04") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{E}", sci);
        StrWriteFmt(&output, "{E}", sci);
        success = success && (ZstrCompare(output.data, "1.234567E+04") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{.3}", short_v);
        StrWriteFmt(&output, "{.3}", short_v);
        success = success && (ZstrCompare(output.data, "1.200") == 0);
        StrClear(&output);
    
        StrWriteFmt(&output, "{>18}", sci);
    
        // Test hexadecimal conversion (lowercase)
        StrClear(&s);
        config = (StrIntFormat) {.base = 16, .uppercase = false, .use_prefix = true};
        StrFromU64(&s, 0xABCD, &config);
    
        // Test hexadecimal conversion (uppercase)
        StrClear(&s);
        config = (StrIntFormat) {.base = 16, .uppercase = true, .use_prefix = true};
        StrFromU64(&s, 0xABCD, &config);
    
        // Test binary conversion
        StrClear(&s);
        config = (StrIntFormat) {.base = 2, .uppercase = false, .use_prefix = true};
        StrFromU64(&s, 42, &config);
    
        // Test octal conversion
        StrClear(&s);
        config = (StrIntFormat) {.base = 8, .uppercase = false, .use_prefix = true};
        StrFromU64(&s, 42, &config);
    
        // Test zero
        StrClear(&s);
        config = (StrIntFormat) {.base = 10, .uppercase = false};
        StrFromU64(&s, 0, &config);
    
        // Test negative decimal conversion (only decimal supports negative sign)
        StrClear(&s);
        config = (StrIntFormat) {.base = 10, .uppercase = false};
        StrFromI64(&s, -12345, &config);
    
        // Test hexadecimal conversion of negative number (negative non-decimal treated as unsigned)
        StrClear(&s);
        config = (StrIntFormat) {.base = 16, .uppercase = false, .use_prefix = true};
        StrFromI64(&s, -0xABCD, &config);
    
        // Test zero
        StrClear(&s);
        config = (StrIntFormat) {.base = 10, .uppercase = false};
        StrFromI64(&s, 0, &config);
    
        // Test binary conversion
        StrClear(&s);
        config = (StrIntFormat) {.base = 2, .uppercase = false, .use_prefix = true};
        StrFromI64(&s, 42, &config);
    
        // Test fractional conversion
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 3, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 123.456, &config);
    
        // Test negative number
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 3, .force_sci = false, .uppercase = false};
        StrFromF64(&s, -123.456, &config);
    
        // Test scientific notation (forced)
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 3, .force_sci = true, .uppercase = false};
        StrFromF64(&s, 123.456, &config);
    
        // Test scientific notation (uppercase)
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 3, .force_sci = true, .uppercase = true};
        StrFromF64(&s, 123.456, &config);
    
        // Test very small number (auto scientific notation)
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 3, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 0.0000123, &config);
    
        // Test very large number (auto scientific notation)
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 2, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 1234567890123.0, &config);
    
        // Test zero
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 2, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 0.0, &config);
    
        // Test infinity
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 2, .force_sci = false, .uppercase = false};
        StrFromF64(&s, INFINITY, &config);
    
        // Test negative infinity
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 2, .force_sci = false, .uppercase = false};
        StrFromF64(&s, -INFINITY, &config);
    
        // Test NaN
        StrClear(&s);
        config = (StrFloatFormat) {.precision = 2, .force_sci = false, .uppercase = false};
        StrFromF64(&s, NAN, &config);
    
            // Test hex round-trip
            StrClear(&s);
            config = (StrIntFormat) {.base = 16, .uppercase = false, .use_prefix = true};
            StrFromU64(&s, u64_values[i], &config);
    
        // Test minimum i64 (avoid INT64_MIN due to negation UB)
        StrClear(&s);
        config = (StrIntFormat) {.base = 10, .uppercase = false};
        StrFromI64(&s, INT64_MIN + 1, &config);
    
        // Test very small floating point
        StrClear(&s);
        StrFloatFormat fconfig = {.precision = 3, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 1e-300, &fconfig);
    
        // Test very large floating point
        StrClear(&s);
        fconfig = (StrFloatFormat) {.precision = 3, .force_sci = false, .uppercase = false};
        StrFromF64(&s, 1e300, &fconfig);
    
            // Test uppercase E
            StrClear(&s);
            config = (StrFloatFormat) {.precision = 3, .force_sci = true, .uppercase = true};
            StrFromF64(&s, sci_values[i], &config);
    // Test StrClear function
    bool test_str_clear(void) {
        WriteFmt("Testing StrClear\n");
    
        Str s = StrInitFromZstr("Hello, World!");
    
        // Clear the string
        StrClear(&s);
    
        // Length should now be 0, but capacity should remain
Last updated on