home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / SNPD9404.ZIP / STR27SEG.C < prev    next >
C/C++ Source or Header  |  1994-04-03  |  4KB  |  149 lines

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