home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / STR27SEG.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  4KB  |  144 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. **  STR27SEG.C - Convert numeric strings to 7-segment strings.
  5. **
  6. **  Public domain by Bob Stout
  7. **
  8. **  Input:  A string (NUL-delimited char array) containing only digits
  9. **          ('0' - '9' chars).
  10. **
  11. **  Output: The same string with each digit converted to a 7-segment
  12. **          representation. Returns NULL on error.
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <ctype.h>
  17. #include "numcnvrt.h"
  18.  
  19. #define CAST(new_type,old_object) (*((new_type *)&old_object))
  20. #define DISP(str) fputs((str), stdout)
  21.  
  22. /*
  23. **  Define the bit significance
  24. **
  25. **     a
  26. **    ---
  27. **   |   |
  28. **  f|   |b
  29. **   | g |
  30. **    ---
  31. **   |   |
  32. **  e|   |c
  33. **   |   |
  34. **    ---
  35. **     d
  36. */
  37.  
  38. struct Seg7disp Seg7digits[10] = {
  39.       { 1, 1, 1, 1, 1, 1, 0 },      /* 0 */
  40.       { 0, 1, 1, 0, 0, 0, 0 },      /* 1 */
  41.       { 1, 1, 0, 1, 1, 0, 1 },      /* 2 */
  42.       { 1, 1, 1, 1, 0, 0, 1 },      /* 3 */
  43.       { 0, 1, 1, 0, 0, 1, 1 },      /* 4 */
  44.       { 1, 0, 1, 1, 0, 1, 1 },      /* 5 */
  45.       { 1, 0, 1, 1, 1, 1, 1 },      /* 6 */
  46.       { 1, 1, 1, 0, 0, 0, 0 },      /* 7 */
  47.       { 1, 1, 1, 1, 1, 1, 1 },      /* 8 */
  48.       { 1, 1, 1, 1, 0, 1, 1 }       /* 9 */
  49. };
  50.  
  51. char *str27seg(char *string)
  52. {
  53.       char *str;
  54.       int ch;
  55.  
  56.       for (str = string ; *str; ++str)
  57.       {
  58.             if (!isdigit(*str))
  59.                   return NULL;
  60.             ch = CAST(int, Seg7digits[*str - '0']);
  61.             *str = (char)(ch & 0xff);
  62.       }
  63.       return string;
  64. }
  65.  
  66. #ifdef TEST
  67.  
  68. main()
  69. {
  70.       char tstrng[] = "0123456789", *segs;
  71.  
  72.       printf("str27seg() returned %p", segs = str27seg(tstrng));
  73.       if (segs)
  74.       {
  75.             char *ptr;
  76.             struct Seg7disp ch;
  77.             int i;
  78.  
  79.             puts(" & produced:\n");
  80.             for (ptr = segs ; *ptr; ++ptr)
  81.             {
  82.                   ch = CAST(struct Seg7disp, *ptr);
  83.                   if (ch.seg_a)
  84.                         DISP(" --- ");
  85.                   else  DISP("     ");
  86.                   DISP("  ");
  87.             }
  88.             puts("");
  89.             for (i = 0; i < 3; ++i)
  90.             {
  91.                   for (ptr = segs ; *ptr; ++ptr)
  92.                   {
  93.                         ch = CAST(struct Seg7disp, *ptr);
  94.                         if (ch.seg_f)
  95.                               DISP("|   ");
  96.                         else  DISP("    ");
  97.                         if (ch.seg_b)
  98.                               DISP("|");
  99.                         else  DISP(" ");
  100.                         DISP("  ");
  101.                   }
  102.                   puts("");
  103.             }
  104.             for (ptr = segs ; *ptr; ++ptr)
  105.             {
  106.                   ch = CAST(struct Seg7disp, *ptr);
  107.                   if (ch.seg_g)
  108.                         DISP(" --- ");
  109.                   else  DISP("     ");
  110.                   DISP("  ");
  111.             }
  112.             puts("");
  113.             for (i = 0; i < 3; ++i)
  114.             {
  115.                   for (ptr = segs ; *ptr; ++ptr)
  116.                   {
  117.                         ch = CAST(struct Seg7disp, *ptr);
  118.                         if (ch.seg_e)
  119.                               DISP("|   ");
  120.                         else  DISP("    ");
  121.                         if (ch.seg_c)
  122.                               DISP("|");
  123.                         else  DISP(" ");
  124.                         DISP("  ");
  125.                   }
  126.                   puts("");
  127.             }
  128.             for (ptr = segs ; *ptr; ++ptr)
  129.             {
  130.                   ch = CAST(struct Seg7disp, *ptr);
  131.                   if (ch.seg_d)
  132.                         DISP(" --- ");
  133.                   else  DISP("     ");
  134.                   DISP("  ");
  135.             }
  136.             puts("");
  137.       }
  138.       else  puts("\n");
  139.  
  140.       return 0;
  141. }
  142.  
  143. #endif /* TEST */
  144.