summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/str27seg.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/str27seg.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/str27seg.c148
1 files changed, 148 insertions, 0 deletions
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 <stdio.h>
+#include <ctype.h>
+
+#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