Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.
debug/debug_printf.c@0:0a841b89d614, 2010-10-11 (annotated)
- Committer:
- AjK
- Date:
- Mon Oct 11 10:34:55 2010 +0000
- Revision:
- 0:0a841b89d614
Totally Alpha quality as this project isn\t completed. Just publishing it as it answers many questions asked in the forums
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AjK | 0:0a841b89d614 | 1 | /**************************************************************************** |
AjK | 0:0a841b89d614 | 2 | * Copyright 2010 Andy Kirkham, Stellar Technologies Ltd |
AjK | 0:0a841b89d614 | 3 | * |
AjK | 0:0a841b89d614 | 4 | * This file is part of the Satellite Observers Workbench (SOWB). |
AjK | 0:0a841b89d614 | 5 | * |
AjK | 0:0a841b89d614 | 6 | * SOWB is free software: you can redistribute it and/or modify |
AjK | 0:0a841b89d614 | 7 | * it under the terms of the GNU General Public License as published by |
AjK | 0:0a841b89d614 | 8 | * the Free Software Foundation, either version 3 of the License, or |
AjK | 0:0a841b89d614 | 9 | * (at your option) any later version. |
AjK | 0:0a841b89d614 | 10 | * |
AjK | 0:0a841b89d614 | 11 | * SOWB is distributed in the hope that it will be useful, |
AjK | 0:0a841b89d614 | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
AjK | 0:0a841b89d614 | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
AjK | 0:0a841b89d614 | 14 | * GNU General Public License for more details. |
AjK | 0:0a841b89d614 | 15 | * |
AjK | 0:0a841b89d614 | 16 | * You should have received a copy of the GNU General Public License |
AjK | 0:0a841b89d614 | 17 | * along with SOWB. If not, see <http://www.gnu.org/licenses/>. |
AjK | 0:0a841b89d614 | 18 | * |
AjK | 0:0a841b89d614 | 19 | * $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $ |
AjK | 0:0a841b89d614 | 20 | * |
AjK | 0:0a841b89d614 | 21 | ***************************************************************************/ |
AjK | 0:0a841b89d614 | 22 | |
AjK | 0:0a841b89d614 | 23 | /* The following is from (with only minor edits to fit onto Mbed):- |
AjK | 0:0a841b89d614 | 24 | Copyright 2001, 2002 Georges Menie (www.menie.org) |
AjK | 0:0a841b89d614 | 25 | stdarg version contributed by Christian Ettinger |
AjK | 0:0a841b89d614 | 26 | See... |
AjK | 0:0a841b89d614 | 27 | http://www.menie.org/georges/embedded/ |
AjK | 0:0a841b89d614 | 28 | http://www.menie.org/georges/embedded/printf-stdarg.c |
AjK | 0:0a841b89d614 | 29 | |
AjK | 0:0a841b89d614 | 30 | This printf function will accept integer formats (%d, %x, %X, %u), string format (%s) |
AjK | 0:0a841b89d614 | 31 | and character format (%c); left and right alignement, padding with space or 'O'. */ |
AjK | 0:0a841b89d614 | 32 | |
AjK | 0:0a841b89d614 | 33 | #include "sowb.h" |
AjK | 0:0a841b89d614 | 34 | #include "debug.h" |
AjK | 0:0a841b89d614 | 35 | #include <stdarg.h> |
AjK | 0:0a841b89d614 | 36 | |
AjK | 0:0a841b89d614 | 37 | #ifdef DEBUG_ON |
AjK | 0:0a841b89d614 | 38 | |
AjK | 0:0a841b89d614 | 39 | static void printchar(char **str, int c) |
AjK | 0:0a841b89d614 | 40 | { |
AjK | 0:0a841b89d614 | 41 | if (str) { |
AjK | 0:0a841b89d614 | 42 | **str = c; |
AjK | 0:0a841b89d614 | 43 | ++(*str); |
AjK | 0:0a841b89d614 | 44 | } |
AjK | 0:0a841b89d614 | 45 | else (void)Uart0_putc(c); |
AjK | 0:0a841b89d614 | 46 | } |
AjK | 0:0a841b89d614 | 47 | |
AjK | 0:0a841b89d614 | 48 | #define PAD_RIGHT 1 |
AjK | 0:0a841b89d614 | 49 | #define PAD_ZERO 2 |
AjK | 0:0a841b89d614 | 50 | |
AjK | 0:0a841b89d614 | 51 | static int prints(char **out, const char *string, int width, int pad) |
AjK | 0:0a841b89d614 | 52 | { |
AjK | 0:0a841b89d614 | 53 | register int pc = 0, padchar = ' '; |
AjK | 0:0a841b89d614 | 54 | |
AjK | 0:0a841b89d614 | 55 | if (width > 0) { |
AjK | 0:0a841b89d614 | 56 | register int len = 0; |
AjK | 0:0a841b89d614 | 57 | register const char *ptr; |
AjK | 0:0a841b89d614 | 58 | for (ptr = string; *ptr; ++ptr) ++len; |
AjK | 0:0a841b89d614 | 59 | if (len >= width) width = 0; |
AjK | 0:0a841b89d614 | 60 | else width -= len; |
AjK | 0:0a841b89d614 | 61 | if (pad & PAD_ZERO) padchar = '0'; |
AjK | 0:0a841b89d614 | 62 | } |
AjK | 0:0a841b89d614 | 63 | if (!(pad & PAD_RIGHT)) { |
AjK | 0:0a841b89d614 | 64 | for ( ; width > 0; --width) { |
AjK | 0:0a841b89d614 | 65 | printchar (out, padchar); |
AjK | 0:0a841b89d614 | 66 | ++pc; |
AjK | 0:0a841b89d614 | 67 | } |
AjK | 0:0a841b89d614 | 68 | } |
AjK | 0:0a841b89d614 | 69 | for ( ; *string ; ++string) { |
AjK | 0:0a841b89d614 | 70 | printchar (out, *string); |
AjK | 0:0a841b89d614 | 71 | ++pc; |
AjK | 0:0a841b89d614 | 72 | } |
AjK | 0:0a841b89d614 | 73 | for ( ; width > 0; --width) { |
AjK | 0:0a841b89d614 | 74 | printchar (out, padchar); |
AjK | 0:0a841b89d614 | 75 | ++pc; |
AjK | 0:0a841b89d614 | 76 | } |
AjK | 0:0a841b89d614 | 77 | |
AjK | 0:0a841b89d614 | 78 | return pc; |
AjK | 0:0a841b89d614 | 79 | } |
AjK | 0:0a841b89d614 | 80 | |
AjK | 0:0a841b89d614 | 81 | /* the following should be enough for 32 bit int */ |
AjK | 0:0a841b89d614 | 82 | #define PRINT_BUF_LEN 12 |
AjK | 0:0a841b89d614 | 83 | |
AjK | 0:0a841b89d614 | 84 | static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) |
AjK | 0:0a841b89d614 | 85 | { |
AjK | 0:0a841b89d614 | 86 | char print_buf[PRINT_BUF_LEN]; |
AjK | 0:0a841b89d614 | 87 | register char *s; |
AjK | 0:0a841b89d614 | 88 | register int t, neg = 0, pc = 0; |
AjK | 0:0a841b89d614 | 89 | register unsigned int u = i; |
AjK | 0:0a841b89d614 | 90 | |
AjK | 0:0a841b89d614 | 91 | if (i == 0) { |
AjK | 0:0a841b89d614 | 92 | print_buf[0] = '0'; |
AjK | 0:0a841b89d614 | 93 | print_buf[1] = '\0'; |
AjK | 0:0a841b89d614 | 94 | return prints (out, print_buf, width, pad); |
AjK | 0:0a841b89d614 | 95 | } |
AjK | 0:0a841b89d614 | 96 | |
AjK | 0:0a841b89d614 | 97 | if (sg && b == 10 && i < 0) { |
AjK | 0:0a841b89d614 | 98 | neg = 1; |
AjK | 0:0a841b89d614 | 99 | u = -i; |
AjK | 0:0a841b89d614 | 100 | } |
AjK | 0:0a841b89d614 | 101 | |
AjK | 0:0a841b89d614 | 102 | s = print_buf + PRINT_BUF_LEN-1; |
AjK | 0:0a841b89d614 | 103 | *s = '\0'; |
AjK | 0:0a841b89d614 | 104 | |
AjK | 0:0a841b89d614 | 105 | while (u) { |
AjK | 0:0a841b89d614 | 106 | t = u % b; |
AjK | 0:0a841b89d614 | 107 | if( t >= 10 ) |
AjK | 0:0a841b89d614 | 108 | t += letbase - '0' - 10; |
AjK | 0:0a841b89d614 | 109 | *--s = t + '0'; |
AjK | 0:0a841b89d614 | 110 | u /= b; |
AjK | 0:0a841b89d614 | 111 | } |
AjK | 0:0a841b89d614 | 112 | |
AjK | 0:0a841b89d614 | 113 | if (neg) { |
AjK | 0:0a841b89d614 | 114 | if( width && (pad & PAD_ZERO) ) { |
AjK | 0:0a841b89d614 | 115 | printchar (out, '-'); |
AjK | 0:0a841b89d614 | 116 | ++pc; |
AjK | 0:0a841b89d614 | 117 | --width; |
AjK | 0:0a841b89d614 | 118 | } |
AjK | 0:0a841b89d614 | 119 | else { |
AjK | 0:0a841b89d614 | 120 | *--s = '-'; |
AjK | 0:0a841b89d614 | 121 | } |
AjK | 0:0a841b89d614 | 122 | } |
AjK | 0:0a841b89d614 | 123 | |
AjK | 0:0a841b89d614 | 124 | return pc + prints (out, s, width, pad); |
AjK | 0:0a841b89d614 | 125 | } |
AjK | 0:0a841b89d614 | 126 | |
AjK | 0:0a841b89d614 | 127 | static int print(char **out, const char *format, va_list args ) |
AjK | 0:0a841b89d614 | 128 | { |
AjK | 0:0a841b89d614 | 129 | register int width, pad; |
AjK | 0:0a841b89d614 | 130 | register int pc = 0; |
AjK | 0:0a841b89d614 | 131 | char scr[2]; |
AjK | 0:0a841b89d614 | 132 | |
AjK | 0:0a841b89d614 | 133 | for (; *format != 0; ++format) { |
AjK | 0:0a841b89d614 | 134 | if (*format == '%') { |
AjK | 0:0a841b89d614 | 135 | ++format; |
AjK | 0:0a841b89d614 | 136 | width = pad = 0; |
AjK | 0:0a841b89d614 | 137 | if (*format == '\0') break; |
AjK | 0:0a841b89d614 | 138 | if (*format == '%') goto out; |
AjK | 0:0a841b89d614 | 139 | if (*format == '-') { |
AjK | 0:0a841b89d614 | 140 | ++format; |
AjK | 0:0a841b89d614 | 141 | pad = PAD_RIGHT; |
AjK | 0:0a841b89d614 | 142 | } |
AjK | 0:0a841b89d614 | 143 | while (*format == '0') { |
AjK | 0:0a841b89d614 | 144 | ++format; |
AjK | 0:0a841b89d614 | 145 | pad |= PAD_ZERO; |
AjK | 0:0a841b89d614 | 146 | } |
AjK | 0:0a841b89d614 | 147 | for ( ; *format >= '0' && *format <= '9'; ++format) { |
AjK | 0:0a841b89d614 | 148 | width *= 10; |
AjK | 0:0a841b89d614 | 149 | width += *format - '0'; |
AjK | 0:0a841b89d614 | 150 | } |
AjK | 0:0a841b89d614 | 151 | if( *format == 's' ) { |
AjK | 0:0a841b89d614 | 152 | register char *s = (char *)va_arg( args, int ); |
AjK | 0:0a841b89d614 | 153 | pc += prints (out, s?s:"(null)", width, pad); |
AjK | 0:0a841b89d614 | 154 | continue; |
AjK | 0:0a841b89d614 | 155 | } |
AjK | 0:0a841b89d614 | 156 | if( *format == 'd' ) { |
AjK | 0:0a841b89d614 | 157 | pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); |
AjK | 0:0a841b89d614 | 158 | continue; |
AjK | 0:0a841b89d614 | 159 | } |
AjK | 0:0a841b89d614 | 160 | if( *format == 'x' ) { |
AjK | 0:0a841b89d614 | 161 | pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); |
AjK | 0:0a841b89d614 | 162 | continue; |
AjK | 0:0a841b89d614 | 163 | } |
AjK | 0:0a841b89d614 | 164 | if( *format == 'X' ) { |
AjK | 0:0a841b89d614 | 165 | pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); |
AjK | 0:0a841b89d614 | 166 | continue; |
AjK | 0:0a841b89d614 | 167 | } |
AjK | 0:0a841b89d614 | 168 | if( *format == 'u' ) { |
AjK | 0:0a841b89d614 | 169 | pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); |
AjK | 0:0a841b89d614 | 170 | continue; |
AjK | 0:0a841b89d614 | 171 | } |
AjK | 0:0a841b89d614 | 172 | if( *format == 'c' ) { |
AjK | 0:0a841b89d614 | 173 | /* char are converted to int then pushed on the stack */ |
AjK | 0:0a841b89d614 | 174 | scr[0] = (char)va_arg( args, int ); |
AjK | 0:0a841b89d614 | 175 | scr[1] = '\0'; |
AjK | 0:0a841b89d614 | 176 | pc += prints (out, scr, width, pad); |
AjK | 0:0a841b89d614 | 177 | continue; |
AjK | 0:0a841b89d614 | 178 | } |
AjK | 0:0a841b89d614 | 179 | } |
AjK | 0:0a841b89d614 | 180 | else { |
AjK | 0:0a841b89d614 | 181 | out: |
AjK | 0:0a841b89d614 | 182 | printchar (out, *format); |
AjK | 0:0a841b89d614 | 183 | ++pc; |
AjK | 0:0a841b89d614 | 184 | } |
AjK | 0:0a841b89d614 | 185 | } |
AjK | 0:0a841b89d614 | 186 | if (out) **out = '\0'; |
AjK | 0:0a841b89d614 | 187 | va_end( args ); |
AjK | 0:0a841b89d614 | 188 | return pc; |
AjK | 0:0a841b89d614 | 189 | } |
AjK | 0:0a841b89d614 | 190 | |
AjK | 0:0a841b89d614 | 191 | |
AjK | 0:0a841b89d614 | 192 | int debug_printf(const char *format, ...) { |
AjK | 0:0a841b89d614 | 193 | #ifdef DEBUG_ON |
AjK | 0:0a841b89d614 | 194 | va_list args; |
AjK | 0:0a841b89d614 | 195 | va_start( args, format ); |
AjK | 0:0a841b89d614 | 196 | return print( 0, format, args ); |
AjK | 0:0a841b89d614 | 197 | #else |
AjK | 0:0a841b89d614 | 198 | return 0; |
AjK | 0:0a841b89d614 | 199 | #endif |
AjK | 0:0a841b89d614 | 200 | } |
AjK | 0:0a841b89d614 | 201 | |
AjK | 0:0a841b89d614 | 202 | int debug_sprintf(char *out, const char *format, ...) { |
AjK | 0:0a841b89d614 | 203 | #ifdef DEBUG_ON |
AjK | 0:0a841b89d614 | 204 | va_list args; |
AjK | 0:0a841b89d614 | 205 | va_start( args, format ); |
AjK | 0:0a841b89d614 | 206 | return print( &out, format, args ); |
AjK | 0:0a841b89d614 | 207 | #else |
AjK | 0:0a841b89d614 | 208 | return 0; |
AjK | 0:0a841b89d614 | 209 | #endif |
AjK | 0:0a841b89d614 | 210 | } |
AjK | 0:0a841b89d614 | 211 | |
AjK | 0:0a841b89d614 | 212 | /* end of #ifdef DEBUG_ON */ |
AjK | 0:0a841b89d614 | 213 | #endif |
AjK | 0:0a841b89d614 | 214 |