Separate helper functions make a small processing pipeline easier to read.

pipeline Each function performs one step and passes a value to the next step.
validation step A validation helper can keep bad values from reaching the final calculation.

Parse Pipeline

digit
parse_pipeline.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

static int parse_digit(char digit) {
    return digit - '0';
}

static int valid_digit(int value) {
    return value >= 0 && value <= 9;
}

static int score_digit(int value) {
    return value * 10;
}

int main(void) {
    char digit = '4';
    int value = parse_digit(digit);
    int score = 0;

    if (valid_digit(value)) {
        score = score_digit(value);
    }

    printf("score=%d\n", score);
    return 0;
}
#include <stdio.h>

static int parse_digit(char digit) {
    return digit - '0';
}

static int valid_digit(int value) {
    return value >= 0 && value <= 9;
}

static int score_digit(int value) {
    return value * 10;
}

int main(void) {
    char digit = '7';
    int value = parse_digit(digit);
    int score = 0;

    if (valid_digit(value)) {
        score = score_digit(value);
    }

    printf("score=%d\n", score);
    return 0;
}
#include <stdio.h>

static int parse_digit(char digit) {
    return digit - '0';
}

static int valid_digit(int value) {
    return value >= 0 && value <= 9;
}

static int score_digit(int value) {
    return value * 10;
}

int main(void) {
    char digit = '/';
    int value = parse_digit(digit);
    int score = 0;

    if (valid_digit(value)) {
        score = score_digit(value);
    }

    printf("score=%d\n", score);
    return 0;
}
  1. digit ← 4

    15int main(void) {16    char digit→ 4 = '4'; //@digit='7', '/'17    int value = parse_digit(digit4);18    int score = 0;
  2. static int parse_digit(char digit)

    3static int parse_digit(char digit4) {4    return digit4 - '0';5}
  3. value ← 4, score ← 0

    16char digit = '4'; //@digit='7', '/'17int value→ 4 = parse_digit(digit4);18int score→ 0 = 0;
  4. static int valid_digit(int value)

    7static int valid_digit(int value4) {8    return value4 >= 0 && value <= 9;9}
  5. if (valid_digit(value))

    20if (valid_digit(value4)) {21    score0 = score_digit(value4);22}
  6. static int score_digit(int value)

    11static int score_digit(int value4) {12    return value4 * 10;13}
  7. score ← 40

    20if (valid_digit(value)) {21    score→ 40 = score_digit(value4);22}
  8. printf("score=%d ", score);

    24    printf("score=%d\n", score40);25    return 0;26}
    outputscore=40
  1. digit ← 7

    15int main(void) {16    char digit→ 7 = '7';17    int value = parse_digit(digit7);18    int score = 0;
  2. static int parse_digit(char digit)

    3static int parse_digit(char digit7) {4    return digit7 - '0';5}
  3. value ← 7, score ← 0

    16char digit = '7';17int value→ 7 = parse_digit(digit7);18int score→ 0 = 0;
  4. static int valid_digit(int value)

    7static int valid_digit(int value7) {8    return value7 >= 0 && value <= 9;9}
  5. if (valid_digit(value))

    20if (valid_digit(value7)) {21    score0 = score_digit(value7);22}
  6. static int score_digit(int value)

    11static int score_digit(int value7) {12    return value7 * 10;13}
  7. score ← 70

    20if (valid_digit(value)) {21    score→ 70 = score_digit(value7);22}
  8. printf("score=%d ", score);

    24    printf("score=%d\n", score70);25    return 0;26}
    outputscore=70
  1. digit ← /

    15int main(void) {16    char digit→ / = '/';17    int value = parse_digit(digit/);18    int score = 0;
  2. static int parse_digit(char digit)

    3static int parse_digit(char digit/) {4    return digit/ - '0';5}
  3. value ← -1, score ← 0

    16char digit = '/';17int value→ -1 = parse_digit(digit/);18int score→ 0 = 0;
  4. static int valid_digit(int value)

    7static int valid_digit(int value-1) {8    return value-1 >= 0 && value <= 9;9}
  5. printf("score=%d ", score);

    24    printf("score=%d\n", score0);25    return 0;26}
    outputscore=0