modernc.org/ccgo/v3@v3.16.14/lib/testdata/tcc-0.9.27/tests/tests2/32_led.c (about) 1 /* example from http://barnyard.syr.edu/quickies/led.c */ 2 3 /* led.c: print out number as if on 7 line led display. I.e., write integer 4 given on command line like this: 5 _ _ _ 6 | _| _| |_| |_ 7 | |_ _| | _| etc. 8 9 We assume the terminal behaves like a classical teletype. So the top 10 lines of all digits have to be printed first, then the middle lines of 11 all digits, etc. 12 13 By Terry R. McConnell 14 15 compile: cc -o led led.c 16 17 If you just want to link in the subroutine print_led that does all the 18 work, compile with -DNO_MAIN, and declare the following in any source file 19 that uses the call: 20 21 extern void print_led(unsigned long x, char *buf); 22 23 Bug: you cannot call repeatedly to print more than one number to a line. 24 That would require curses or some other terminal API that allows moving the 25 cursor to a previous line. 26 27 */ 28 29 30 31 #include <stdlib.h> 32 #include <stdio.h> 33 34 #define MAX_DIGITS 32 35 #define NO_MAIN 36 37 38 /* Print the top line of the digit d into buffer. 39 Does not null terminate buffer. */ 40 41 void topline(int d, char *p){ 42 43 *p++ = ' '; 44 switch(d){ 45 46 /* all these have _ on top line */ 47 48 case 0: 49 case 2: 50 case 3: 51 case 5: 52 case 7: 53 case 8: 54 case 9: 55 *p++ = '_'; 56 break; 57 default: 58 *p++=' '; 59 60 } 61 *p++=' '; 62 } 63 64 /* Print the middle line of the digit d into the buffer. 65 Does not null terminate. */ 66 67 void midline(int d, char *p){ 68 69 switch(d){ 70 71 /* those that have leading | on middle line */ 72 73 case 0: 74 case 4: 75 case 5: 76 case 6: 77 case 8: 78 case 9: 79 *p++='|'; 80 break; 81 default: 82 *p++=' '; 83 } 84 switch(d){ 85 86 /* those that have _ on middle line */ 87 88 case 2: 89 case 3: 90 case 4: 91 case 5: 92 case 6: 93 case 8: 94 case 9: 95 *p++='_'; 96 break; 97 default: 98 *p++=' '; 99 100 } 101 switch(d){ 102 103 /* those that have closing | on middle line */ 104 105 case 0: 106 case 1: 107 case 2: 108 case 3: 109 case 4: 110 case 7: 111 case 8: 112 case 9: 113 *p++='|'; 114 break; 115 default: 116 *p++=' '; 117 118 } 119 } 120 121 /* Print the bottom line of the digit d. Does not null terminate. */ 122 123 void botline(int d, char *p){ 124 125 126 switch(d){ 127 128 /* those that have leading | on bottom line */ 129 130 case 0: 131 case 2: 132 case 6: 133 case 8: 134 *p++='|'; 135 break; 136 default: 137 *p++=' '; 138 } 139 switch(d){ 140 141 /* those that have _ on bottom line */ 142 143 case 0: 144 case 2: 145 case 3: 146 case 5: 147 case 6: 148 case 8: 149 *p++='_'; 150 break; 151 default: 152 *p++=' '; 153 154 } 155 switch(d){ 156 157 /* those that have closing | on bottom line */ 158 159 case 0: 160 case 1: 161 case 3: 162 case 4: 163 case 5: 164 case 6: 165 case 7: 166 case 8: 167 case 9: 168 *p++='|'; 169 break; 170 default: 171 *p++=' '; 172 173 } 174 } 175 176 /* Write the led representation of integer to string buffer. */ 177 178 void print_led(unsigned long x, char *buf) 179 { 180 181 int i=0,n; 182 static int d[MAX_DIGITS]; 183 184 185 /* extract digits from x */ 186 187 n = ( x == 0L ? 1 : 0 ); /* 0 is a digit, hence a special case */ 188 189 while(x){ 190 d[n++] = (int)(x%10L); 191 if(n >= MAX_DIGITS)break; 192 x = x/10L; 193 } 194 195 /* print top lines of all digits */ 196 197 for(i=n-1;i>=0;i--){ 198 topline(d[i],buf); 199 buf += 3; 200 *buf++=' '; 201 } 202 *buf++='\n'; /* move teletype to next line */ 203 204 /* print middle lines of all digits */ 205 206 for(i=n-1;i>=0;i--){ 207 midline(d[i],buf); 208 buf += 3; 209 *buf++=' '; 210 } 211 *buf++='\n'; 212 213 /* print bottom lines of all digits */ 214 215 for(i=n-1;i>=0;i--){ 216 botline(d[i],buf); 217 buf += 3; 218 *buf++=' '; 219 } 220 *buf++='\n'; 221 *buf='\0'; 222 } 223 224 int main() 225 { 226 char buf[5*MAX_DIGITS]; 227 print_led(1234567, buf); 228 printf("%s\n",buf); 229 230 return 0; 231 } 232 233 #ifndef NO_MAIN 234 int main(int argc, char **argv) 235 { 236 237 int i=0,n; 238 long x; 239 static int d[MAX_DIGITS]; 240 char buf[5*MAX_DIGITS]; 241 242 if(argc != 2){ 243 fprintf(stderr,"led: usage: led integer\n"); 244 return 1; 245 } 246 247 /* fetch argument from command line */ 248 249 x = atol(argv[1]); 250 251 /* sanity check */ 252 253 if(x<0){ 254 fprintf(stderr,"led: %d must be non-negative\n",x); 255 return 1; 256 } 257 258 print_led(x,buf); 259 printf("%s\n",buf); 260 261 return 0; 262 263 } 264 #endif 265 266 /* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/