From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/str27seg.c | 148 ++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/str27seg.c (limited to 'reference/C/CONTRIB/SNIP/str27seg.c') diff --git a/reference/C/CONTRIB/SNIP/str27seg.c b/reference/C/CONTRIB/SNIP/str27seg.c new file mode 100755 index 0000000..f36e841 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/str27seg.c @@ -0,0 +1,148 @@ +/* +** STR27SEG.C - Convert numeric strings to 7-segment strings. +** +** Public domain by Bob Stout +** +** Input: A string (NUL-delimited char array) containing only digits +** ('0' - '9' chars). +** +** Output: The same string with each digit converted to a 7-segment +** representation. Returns NULL on error. +*/ + +#include +#include + +#define CAST(new_type,old_object) (*((new_type *)&old_object)) +#define DISP(str) fputs((str), stdout) + +/* +** Define the bit significance +** +** a +** --- +** | | +** f| |b +** | g | +** --- +** | | +** e| |c +** | | +** --- +** d +*/ + +struct Seg7disp { + unsigned seg_a : 1; + unsigned seg_b : 1; + unsigned seg_c : 1; + unsigned seg_d : 1; + unsigned seg_e : 1; + unsigned seg_f : 1; + unsigned seg_g : 1; +} Seg7digits[10] = { + { 1, 1, 1, 1, 1, 1, 0 }, /* 0 */ + { 0, 1, 1, 0, 0, 0, 0 }, /* 1 */ + { 1, 1, 0, 1, 1, 0, 1 }, /* 2 */ + { 1, 1, 1, 1, 0, 0, 1 }, /* 3 */ + { 0, 1, 1, 0, 0, 1, 1 }, /* 4 */ + { 1, 0, 1, 1, 0, 1, 1 }, /* 5 */ + { 1, 0, 1, 1, 1, 1, 1 }, /* 6 */ + { 1, 1, 1, 0, 0, 0, 0 }, /* 7 */ + { 1, 1, 1, 1, 1, 1, 1 }, /* 8 */ + { 1, 1, 1, 1, 0, 1, 1 } /* 9 */ +}; + +char *str27seg(char *string) +{ + char *str; + int ch; + + for (str = string ; *str; ++str) + { + if (!isdigit(*str)) + return NULL; + ch = CAST(int, Seg7digits[*str - '0']); + *str = (char)(ch & 0xff); + } + return string; +} + +#ifdef TEST + +main() +{ + char tstrng[] = "0123456789", *segs; + + printf("str27seg() returned %p", segs = str27seg(tstrng)); + if (segs) + { + char *ptr; + struct Seg7disp ch; + int i; + + puts(" & produced:\n"); + for (ptr = segs ; *ptr; ++ptr) + { + ch = CAST(struct Seg7disp, *ptr); + if (ch.seg_a) + DISP(" --- "); + else DISP(" "); + DISP(" "); + } + puts(""); + for (i = 0; i < 3; ++i) + { + for (ptr = segs ; *ptr; ++ptr) + { + ch = CAST(struct Seg7disp, *ptr); + if (ch.seg_f) + DISP("| "); + else DISP(" "); + if (ch.seg_b) + DISP("|"); + else DISP(" "); + DISP(" "); + } + puts(""); + } + for (ptr = segs ; *ptr; ++ptr) + { + ch = CAST(struct Seg7disp, *ptr); + if (ch.seg_g) + DISP(" --- "); + else DISP(" "); + DISP(" "); + } + puts(""); + for (i = 0; i < 3; ++i) + { + for (ptr = segs ; *ptr; ++ptr) + { + ch = CAST(struct Seg7disp, *ptr); + if (ch.seg_e) + DISP("| "); + else DISP(" "); + if (ch.seg_c) + DISP("|"); + else DISP(" "); + DISP(" "); + } + puts(""); + } + for (ptr = segs ; *ptr; ++ptr) + { + ch = CAST(struct Seg7disp, *ptr); + if (ch.seg_d) + DISP(" --- "); + else DISP(" "); + DISP(" "); + } + puts(""); + } + else puts("\n"); + + return 0; +} + +#endif -- cgit v1.2.3-54-g00ecf