This might be a little off topic. I took rprintf.c and rprintf.h from mthomas' latest demo and modified them to prntf.c and prntf.h. There are 2 parts, a prntf macro and a sprntf function. Is it correct to include a temporary string in the macro or should I define this somewhere else? I would have made prntf a function if I knew how to pass the ... on to the sprntf function, can this be done? In the .c part, the 'i' case of the switch statement has parse errors unless the curley braces encapsulate the entire case. In my C book it shows cases all without curley braces, what should I do about these curley braces? Any comments or suggestions appreciated. Below is the .h file and below that is the .c file. #ifndef PRNTF_H_ #define PRNTF_H_ #include <string.h> //for strlen() #define SPRNTF_LENGTH 50 void sprntf(char* dest,char const *format, ...); #define prntf(format, ...) char temp [SPRNTF_LENGTH];\ sprntf(temp, format, ## _VA_ARGS_);\ AT91F_US_SendFrame((AT91S_USART*)AT91C_BASE_DBGU,\ temp, strlen(temp), 0,0); //only this sendstring function should be changed for use in other platforms #endif /*PRNTF_H_*/ /* compact formatting code based on rprintf by martin thomas * Changes made by outer_space: * -Renamed functions with prnt instead of print to note abbreviated nature * -Changed from putchar function to dma putstring function * -DMA serial specific to sam7s * -Reduced size and functionality * -Added %f * -All output via prntf, change only the header for different platforms */ #include "prntf.h" #include <stdarg.h> void sprntf(char* dest,char const *format, ...) { char format_flag; char *ptr; char hold [32]; double fval; long int digit, ival; va_list ap; va_start(ap, format); for (;;){ while ((format_flag = *(format++)) != '%') { if (!format_flag) { va_end(ap); *dest = 0; // return; } *dest++ = format_flag; } format_flag = *format++; switch (format_flag) { case 'c': format_flag = va_arg(ap,int); *dest = format_flag; dest++; break; case 'i': { ival = va_arg(ap,int); if(ival<0) { ival = -ival; *dest++ = '-'; } ptr = hold; for(digit = 10000; digit >0; digit/=10) { *ptr++ = ival / digit + '0'; ival %= digit; } *ptr = 0; //mark end of string ptr = hold; //set pointer back to beginning while(*ptr == '0'){ptr++;} if(!*ptr){*--ptr = '0';} //if number is zero, must have 1 leading '0' while( (*dest++ = *ptr++) ); //strcopy into dest dest--; //negate \0 break; //*/ } case 's': ptr = va_arg(ap,char *); while( (*dest++ = *ptr++) ); //strcopy dest--; //negate \0 break; ///* case 'f': ptr=hold; fval = va_arg(ap,double); ival = fval*100000; for(digit = 1000000000; digit > 0; digit /= 10) { if(digit == 10000){*ptr++ = '.';} //decimal point here *ptr++ = ival / digit + '0'; ival %= digit; } while(*--ptr == '0'); //erase trailing zeros if(*ptr == '.'){ptr--;} //erase decimal if nothing is after it *++ptr = 0; //mark end of string ptr = hold; //set pointer back to beginning while(*ptr == '0'){ptr++;} //strip leading zeros if(*ptr == '.'){*--ptr = '0';} //if nothing to left of '.' must put '0' while( (*dest++ = *ptr++) ); //strcopy into dest dest--; //negate \0, added before return break; default: *dest++ = '%'; *dest++ = format_flag; break; } } }
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.