Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Thread

large code generation with vsprintf

large code generation with vsprintf

2005-01-28 by gene_klein2000

Hi,

I hope someone will help me with the next problem.


When I'm using vsprintf the code generated by th compiler
grows with about 30kB. 
Can anyone explain what I can to keep the code small and
still be using th vsprintf.

I'm using the gnuarm compiler.


Thanks,

Gene

Re: [lpc2000] large code generation with vsprintf

2005-01-28 by Leon Heller

----- Original Message ----- 
Show quoted textHide quoted text
From: "gene_klein2000" <gene_klein@...>
To: <lpc2000@yahoogroups.com>
Sent: Friday, January 28, 2005 11:48 AM
Subject: [lpc2000] large code generation with vsprintf


>
>
> Hi,
>
> I hope someone will help me with the next problem.
>
>
> When I'm using vsprintf the code generated by th compiler
> grows with about 30kB.
> Can anyone explain what I can to keep the code small and
> still be using th vsprintf.
>
> I'm using the gnuarm compiler.

Functions like printf have a lot of code in them. I'd write my own function.

Leon 



-- 
Internal Virus Database is out-of-date.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.7.1 - Release Date: 19/01/2005

Re: [lpc2000] large code generation with vsprintf

2005-01-28 by Marko Pavlin

Use keil DKarm if you have budget for that. Optimization is better than 
using GCC.

Leon Heller wrote:
Show quoted textHide quoted text
> ----- Original Message -----
> From: "gene_klein2000" <gene_klein@...>
> To: <lpc2000@yahoogroups.com>
> Sent: Friday, January 28, 2005 11:48 AM
> Subject: [lpc2000] large code generation with vsprintf
> 
> 
>  >
>  >
>  > Hi,
>  >
>  > I hope someone will help me with the next problem.
>  >
>  >
>  > When I'm using vsprintf the code generated by th compiler
>  > grows with about 30kB.
>  > Can anyone explain what I can to keep the code small and
>  > still be using th vsprintf.
>  >
>  > I'm using the gnuarm compiler.
> 
> Functions like printf have a lot of code in them. I'd write my own function.
> 
> Leon
> 
> 
> 
> -- 
> Internal Virus Database is out-of-date.
> Checked by AVG Anti-Virus.
> Version: 7.0.300 / Virus Database: 265.7.1 - Release Date: 19/01/2005
> 
> 
> ------------------------------------------------------------------------
> *Yahoo! Groups Links*
> 
>     * To visit your group on the web, go to:
>       http://groups.yahoo.com/group/lpc2000/
>        
>     * To unsubscribe from this group, send an email to:
>       lpc2000-unsubscribe@yahoogroups.com
>       <mailto:lpc2000-unsubscribe@yahoogroups.com?subject=Unsubscribe>
>        
>     * Your use of Yahoo! Groups is subject to the Yahoo! Terms of
>       Service <http://docs.yahoo.com/info/terms/>. 
> 
>

Re: large code generation with vsprintf

2005-01-28 by gene_klein2000

Leon,

thanks for your answer.


Can you point me in a direction for finding such routines
which are useable for.

Gene.


--- In lpc2000@yahoogroups.com, "Leon Heller" <leon.heller@d...> wrote:
> ----- Original Message ----- 
> From: "gene_klein2000" <gene_klein@h...>
> To: <lpc2000@yahoogroups.com>
> Sent: Friday, January 28, 2005 11:48 AM
> Subject: [lpc2000] large code generation with vsprintf
> 
> 
> >
> >
> > Hi,
> >
> > I hope someone will help me with the next problem.
> >
> >
> > When I'm using vsprintf the code generated by th compiler
> > grows with about 30kB.
> > Can anyone explain what I can to keep the code small and
> > still be using th vsprintf.
> >
> > I'm using the gnuarm compiler.
> 
> Functions like printf have a lot of code in them. I'd write my own
function.
Show quoted textHide quoted text
> 
> Leon 
> 
> 
> 
> -- 
> Internal Virus Database is out-of-date.
> Checked by AVG Anti-Virus.
> Version: 7.0.300 / Virus Database: 265.7.1 - Release Date: 19/01/2005

Re: [lpc2000] Re: large code generation with vsprintf

2005-01-28 by Leon Heller

----- Original Message ----- 
Show quoted textHide quoted text
From: "gene_klein2000" <gene_klein@...>
To: <lpc2000@yahoogroups.com>
Sent: Friday, January 28, 2005 1:15 PM
Subject: [lpc2000] Re: large code generation with vsprintf


>
>
> Leon,
>
> thanks for your answer.
>
>
> Can you point me in a direction for finding such routines
> which are useable for.

I'd simply overwrite the string by finding its address in memory, and poking 
the characters directly into it, then placing the null byte in the 
appropriate place.

Leon
Leon 



-- 
Internal Virus Database is out-of-date.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.7.1 - Release Date: 19/01/2005

Re: [lpc2000] large code generation with vsprintf

2005-01-28 by 42Bastian Schick

>
> When I'm using vsprintf the code generated by th compiler
> grows with about 30kB.
> Can anyone explain what I can to keep the code small and
> still be using th vsprintf.
>
> I'm using the gnuarm compiler.

give vsiprintf a chance, it does not have floating point support.

Also newlib can be tuned regarding these things.


-- 
42Bastian Schick

Re: large code generation with vsprintf

2005-01-28 by tah2k

Hi Gene-

I ran into the same problem a few years ago when I was trying to use 
sprintf in my boot block. It turns out that most of the code is 
related to floating point conversions. I wrote my own 'tprintf' ('t' 
for Tim) that does everything except floating point and it is very 
tight and small. I can email it to you if youlike.

-Tim

--- In lpc2000@yahoogroups.com, "gene_klein2000" <gene_klein@h...> 
wrote:
Show quoted textHide quoted text
> 
> Hi,
> 
> I hope someone will help me with the next problem.
> 
> 
> When I'm using vsprintf the code generated by th compiler
> grows with about 30kB. 
> Can anyone explain what I can to keep the code small and
> still be using th vsprintf.
> 
> I'm using the gnuarm compiler.
> 
> 
> Thanks,
> 
> Gene

Re: large code generation with vsprintf

2005-01-28 by gene_klein2000

Hoi Tim,

It would be great if you wanna mail it to me.

THANKS,

Gene.

--- In lpc2000@yahoogroups.com, "tah2k" <tah2k@y...> wrote:
Show quoted textHide quoted text
> 
> Hi Gene-
> 
> I ran into the same problem a few years ago when I was trying to use 
> sprintf in my boot block. It turns out that most of the code is 
> related to floating point conversions. I wrote my own 'tprintf' ('t' 
> for Tim) that does everything except floating point and it is very 
> tight and small. I can email it to you if youlike.
> 
> -Tim
> 
> --- In lpc2000@yahoogroups.com, "gene_klein2000" <gene_klein@h...> 
> wrote:
> > 
> > Hi,
> > 
> > I hope someone will help me with the next problem.
> > 
> > 
> > When I'm using vsprintf the code generated by th compiler
> > grows with about 30kB. 
> > Can anyone explain what I can to keep the code small and
> > still be using th vsprintf.
> > 
> > I'm using the gnuarm compiler.
> > 
> > 
> > Thanks,
> > 
> > Gene

Re: large code generation with vsprintf

2005-01-28 by tah2k

I couldn't figure out how to get your email, so I will just attach 
it here....Now that I pasted it, its a mess. If you can't resolve 
the linewrap mess, just send me your email address.

/********************************************************************
**********
Filename:		tprintf.h
Description:	The following function is a limited version of 
sprintf(). It is 
				useful for applications where memory 
is limited or code size
				is an issue.
*********************************************************************
**********/

#ifndef TPRINTF_H
#define TPRINTF_H

extern "C" void tprintf(INT8S* buf, const INT8S* format, ...);

#endif

/******************************* End of 
file***********************************/


/********************************************************************
**********
Filename:		tprintf.cpp
Description:	The following function is a limited version of 
sprintf(). It is 
				useful for applications where memory 
is limited or code size
				is an issue.
*********************************************************************
**********/

/////////////////////////////////////////////////////////////////////
//////////
// includes
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include "Typedefs.h"

/////////////////////////////////////////////////////////////////////
//////////
// defines

/////////////////////////////////////////////////////////////////////
//////////
// Static's

/********************************************************************
**********
Name:			numToAscii()
Description:	The following function converts an integer to its 
ASCII 
				representation in a given numeric 
base.
Input:			char* buf: Preallocated storage to place the 
ASCII representation
				unsigned long num: The number to be 
converted to ASCII
				int base: The number base to 
represent the number.
Output:		None
*********************************************************************
**********/
extern "C" void numToAscii(INT8S* buf, INT32U num, INT32S base) {

	static INT8S digits[] = "0123456789ABCDEF";

	INT32U temp;

	if(num == 0L){
		// If the number is 0, just stuf a "0" into the 
buffer
		buf[0] = '0';
		buf[1] = '\0';
	}
	else{
		// Figure out the length necessary of the ASCII 
string representing
		// the number
		for(temp = num; temp > 0; temp /= base)
			buf++;

		// Mark the spot that will be the end of the string
		*buf = '\0';

		// Generate ASCII representation
		for(temp = num; temp > 0; temp /= base)
			*--buf = digits[temp % base];
	}
}

/********************************************************************
**********
Name:			tprintf()
Description:	The following function is a limited version of 
sprintf(). It is 
				useful for applications where memory 
is limited or code size
				is an issue. The syntax implements 
the sprintf() standard argument
				passing. A conversion specification 
looks like:
				% {flags} {field_width} 
{length_modifier} conversion

				where flags=
					'-':	Left justify field
					'0':	Zero padding to 
field width, for d, l, h, and X

				where field_width=
					Number of characters to be 
printed in the field. Field width 
					will be padded with space if 
needed. If given as '*', the
					next argument should be an 
integer holding the field width.

				where length_modifier=
					h: Used before d or X 
conversions to denote a short int
					l: Used before d or X 
conversions to denote a long int

				where conversion=
					d: Write signed decimal 
integer value
					X: Write an unsigned 
hexadecimal (0-9, ABC...) integer value
					c: Write a single character
					s: Write a string

Input:			char* buf: Pointer to a preallocated buffer 
to store formatted
						   output
				const char* format: The printf style 
format string reduced to
								
	the above control fields
				...: Variable length argument list
Output:		None
*********************************************************************
**********/
extern "C" void tprintf(INT8S* buf, const INT8S* format, ...) {

	// Points to each unnamed argument in turn
	va_list argPtr;

	// Value of the pad string
	INT32S pad;
	INT32S clip;

	// Conversion of ASCII to long
	INT32S longVal;

	INT8S* src;
	INT8S* dst;

	// Character used to pad a field appropriately given a width 
argument
	INT8S padChar = ' ';

	// Is the format requesting a zero pad?
	BOOL reqZeroPad = FALSE;

	// Make argPtr point to the first unnamed argument
	va_start(argPtr, format);

	while(*format) {
		// Loop through the entire format string

		if(*format != '%'){
			// If not the start of a conversion 
specification, copy the character
			// literally
			*buf++ = *format++;
		}
		else{
			// Found the start of a conversion 
specification, increment past the
			// "%" and get the field width value
			format++;

			if(*format == '*'){
				// A width specification, an 'int' 
argument from the argument
				// list supplies the value
				pad = va_arg(argPtr, int);
				
				// Increment past the '*'
				format++;
			}
			else{
				if(*format == '-' || (*format >= '0' 
&& *format <= '9')){
					// A width specification 
controlling the minimum number of
					// characters printed. The '-
' specifies left justification.
					pad = atoi(format);

					// A leading zero indicates 
the pad character should be a 
					// '0' instead of a space
					if(*format == '0')
						reqZeroPad = TRUE;

					do{
						// Increment past 
the width specification
						format++;
					}
					while((*format >= '0')&&
(*format <= '9'));
				}
				else
					// No width value was 
specified
					pad = 0;
			}

			// Handle the type
			switch(*format++){
				case 'c':
					// Write a single character. 
Note: `char's are always widened 
					// when they appear in 
variable or unknown argument positions.
					// Obtain a widened char and 
narrow it.
					buf[0] = (char)(va_arg
(argPtr, INT32U));
					buf[1] = '\0';
					break;
				case 's':
					// Write a string
					src = va_arg(argPtr, char*);
					strcpy(buf, src);
					break;
				case 'l':
					// Write a signed decimal 
long integer value

					// Skip the 'd' in '%ld'
					format++;

					// Pop the argument off teh 
list
					longVal = va_arg(argPtr, 
long);

					dst = buf;
					if(longVal<0){
						// Negative number
						*dst++ = '-';
						longVal = -longVal;
					}

					// Convert number to ASCII 
representation
					numToAscii(dst, longVal, 10);

					// Determine pad character
					if(reqZeroPad)
						padChar = '0';

					break;
				case 'h':
					// Write a signed short 
integer value

					// Skip the 'd' in '%ld'
					format++;

					// Pop the argument off teh 
list
					longVal = va_arg(argPtr, 
INT32U);

					dst = buf;
					if(longVal<0){
						// Negative number
						*dst++ = '-';
						longVal = -longVal;
					}

					// Convert number to ASCII 
representation
					numToAscii(dst, longVal, 10);

					// Determine pad character
					if(reqZeroPad)
						padChar = '0';

					break;
				case 'X':
					// Write an unsigned 
hexidecimal (0-9, ABC...) integer value
					longVal = (long)va_arg
(argPtr, int);

					// Convert number to ASCII 
representation
					numToAscii(buf, longVal, 16);

					// Determine pad character
					if(reqZeroPad)
						padChar = '0';

					break;
				case 'd':
					// Write a signed decimal 
integer value
					longVal = (long)va_arg
(argPtr, int);

					dst = buf;
					if(longVal<0){
						// Negative number
						*dst++ = '-';
						longVal = -longVal;
					}

					// Convert number to ASCII 
representation
					numToAscii(dst, longVal, 10);

					break;
				default:
					buf[0] = format[-1];
					buf[1] = '\0';
					break;			
					
			};

			// Fix the padding if the value is too short
			clip = strlen(buf);
			if(pad < 0){
				// Add spaces after the value
				pad = -pad - clip;

				for(buf += clip; pad > 0; pad++)
					*buf++ = padChar;
				buf = '\0';
			}
			else{
				// Add spaces before the value
				pad -= clip;

				if(pad > 0){
					// Width specification is 
greater than string length, therefore
					// pad appropriatly
					
					// Point to the end of the 
destination string
					src = buf + clip;

					// Point to the end of the 
unpadded destination string
					dst = src + pad;

					// Terminate this field
					*dst = '\0';

					while(src > buf)
						// Right justify the 
string within the width specification
						*--dst = *--src;

					while(dst > buf)
						// Fill with spaces 
to the left
						*--dst = padChar;
				}

				buf += strlen(buf);
			}
		}
	}

	// Mark the end of the output strin
	*buf = '\0';

	// Clean up the variable argument list
	va_end(argPtr);
}

/******************************* End of 
file***********************************/






--- In lpc2000@yahoogroups.com, "gene_klein2000" <gene_klein@h...> 
wrote:
> 
> Hoi Tim,
> 
> It would be great if you wanna mail it to me.
> 
> THANKS,
> 
> Gene.
> 
> --- In lpc2000@yahoogroups.com, "tah2k" <tah2k@y...> wrote:
> > 
> > Hi Gene-
> > 
> > I ran into the same problem a few years ago when I was trying to 
use 
> > sprintf in my boot block. It turns out that most of the code is 
> > related to floating point conversions. I wrote my own 'tprintf' 
('t' 
> > for Tim) that does everything except floating point and it is 
very 
> > tight and small. I can email it to you if youlike.
> > 
> > -Tim
> > 
> > --- In lpc2000@yahoogroups.com, "gene_klein2000" 
<gene_klein@h...> 
Show quoted textHide quoted text
> > wrote:
> > > 
> > > Hi,
> > > 
> > > I hope someone will help me with the next problem.
> > > 
> > > 
> > > When I'm using vsprintf the code generated by th compiler
> > > grows with about 30kB. 
> > > Can anyone explain what I can to keep the code small and
> > > still be using th vsprintf.
> > > 
> > > I'm using the gnuarm compiler.
> > > 
> > > 
> > > Thanks,
> > > 
> > > Gene

STR71X group?

2005-01-28 by Curt Powell

Does anyone know if there is a yahoo group (or equivalent) for the STR71X
mcus?

Re: [lpc2000] STR71X group?

2005-01-28 by Robert Adsett

At 10:14 AM 1/28/05 -0800, you wrote:

>Does anyone know if there is a yahoo group (or equivalent) for the STR71X
>mcus?

http://groups.yahoo.com/group/str7

It's pretty close to dead at the moment though.

Robert

" 'Freedom' has no meaning of itself.  There are always restrictions,
be they legal, genetic, or physical.  If you don't believe me, try to
chew a radio signal. "

                         Kelvin Throop, III

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.