Modular C
Parse Pipeline
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
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;
}
digit ← 4
15int main(void) {16 char digit→ 4 = '4'; //@digit='7', '/'17 int value = parse_digit(digit4);18 int score = 0;static int parse_digit(char digit)
3static int parse_digit(char digit4) {4 return digit4 - '0';5}value ← 4, score ← 0
16char digit = '4'; //@digit='7', '/'17int value→ 4 = parse_digit(digit4);18int score→ 0 = 0;static int valid_digit(int value)
7static int valid_digit(int value4) {8 return value4 >= 0 && value <= 9;9}if (valid_digit(value))
20if (valid_digit(value4)) {21 score0 = score_digit(value4);22}static int score_digit(int value)
11static int score_digit(int value4) {12 return value4 * 10;13}score ← 40
20if (valid_digit(value)) {21 score→ 40 = score_digit(value4);22}printf("score=%d ", score);
24 printf("score=%d\n", score40);25 return 0;26}outputscore=40
digit ← 7
15int main(void) {16 char digit→ 7 = '7';17 int value = parse_digit(digit7);18 int score = 0;static int parse_digit(char digit)
3static int parse_digit(char digit7) {4 return digit7 - '0';5}value ← 7, score ← 0
16char digit = '7';17int value→ 7 = parse_digit(digit7);18int score→ 0 = 0;static int valid_digit(int value)
7static int valid_digit(int value7) {8 return value7 >= 0 && value <= 9;9}if (valid_digit(value))
20if (valid_digit(value7)) {21 score0 = score_digit(value7);22}static int score_digit(int value)
11static int score_digit(int value7) {12 return value7 * 10;13}score ← 70
20if (valid_digit(value)) {21 score→ 70 = score_digit(value7);22}printf("score=%d ", score);
24 printf("score=%d\n", score70);25 return 0;26}outputscore=70
digit ← /
15int main(void) {16 char digit→ / = '/';17 int value = parse_digit(digit/);18 int score = 0;static int parse_digit(char digit)
3static int parse_digit(char digit/) {4 return digit/ - '0';5}value ← -1, score ← 0
16char digit = '/';17int value→ -1 = parse_digit(digit/);18int score→ 0 = 0;static int valid_digit(int value)
7static int valid_digit(int value-1) {8 return value-1 >= 0 && value <= 9;9}printf("score=%d ", score);
24 printf("score=%d\n", score0);25 return 0;26}outputscore=0