1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include "argument_printer.h"
// okay to copy/adapt

// prints the digit, returning true if it printed, false if invalid
/*
int _print_digit(int digit) {
    int did_print = 0;
    if (digit >= 0 && digit < 10)
        fputc(48 + digit, stdout);
            did_print = 1;
    if (digit >= 10 && digit < 36)
        fputc(97 + digit, stdout);
            did_print = 1;
    return did_print;
}
*/

static bool _print_digit(int digit) {
    bool did_print = false;
    if (digit >= 0 && digit < 10) {
        fputc('0' + digit, stdout);
        did_print = true;
    }
    if (digit >= 10 && digit < 36) {
        fputc('a' + digit - 10, stdout);
        did_print = true;
    }
    return did_print;
}

const char* INVALID_DIGIT = "Invalid Digit";

/* common example of tmp is swapping
 * something like old_ as a prefix might be better
void swap(int a, int b) {
    int old_a = a;
    a = b;
    b = old_a;
}
*/


void print_arguments(char* format, ...) {
    va_list arguments;
    va_start(arguments, format);

    // format_idx may increment multiple times
    // in a single iteration
    for (int format_idx = 0;
            format[format_idx] != 0;
            format_idx++) {
        switch(format[format_idx]) {
            case 'd': {
                int int_arg = va_arg(arguments, int);
                if (!_print_digit(int_arg)) {
                    fputs(INVALID_DIGIT, stdout);
                }
                fputc('\n', stdout);
                break;
            }
            case 'f': {
                double double_arg = va_arg(arguments, double);
                int int_arg = double_arg;
                if (!_print_digit(int_arg)) {
                    fputs(INVALID_DIGIT, stdout);
                }
                fputc('\n', stdout);
                break;
            }

            case 'c': {
                char char_arg = va_arg(arguments, int);
                fputc(char_arg, stdout);
                fputc('\n', stdout);
                break;
            }

            case 's': {
                char* str_arg = va_arg(arguments, char*);
                fputs(str_arg, stdout);
                fputc('\n', stdout);
                break;
            }

            default:
                fputc(format[format_idx], stdout);
                fputc('\n', stdout);
        }
    }

    va_end(arguments);
}

© Copyright 2024 Alexander J. Quinn & David Burnett         This content is protected and may not be shared, uploaded, or distributed.