Hi,
itoa() in msp430-libc does not output zero value.
I have attached the corrected source, also version for ltoa/utoa/ultoa
with changed Makefile and stdlib.h.
Hope this can be put into cvs by somebody.
Hardy
/*
* Copyright (c) 2001 Dmitry Dicky [email protected]
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS `AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: stdlib.h,v 1.10 2004/07/02 19:09:30 ctakahashi Exp $
*/
#ifndef _STDLIB_H_
#define _STDLIB_H_
#include <stddef.h>
#include <sys/types.h>
#ifndef __ATTR_CONST__
#define __ATTR_CONST__ __attribute__((__const__))
#endif
#ifndef __ATTR_MALLOC__
#define __ATTR_MALLOC__ __attribute__((__malloc__))
#endif
#ifndef __ATTR_NORETURN__
#define __ATTR_NORETURN__ __attribute__((__noreturn__))
#endif
#ifndef __ATTR_PURE__
#define __ATTR_PURE__ __attribute__((__pure__))
#endif
#ifndef exit
extern void exit(int) __asm__("__stop_progExec__") __ATTR_CONST__;
#endif
typedef struct {
int quot;
int rem;
} div_t;
extern div_t div(int num, int denom);
typedef struct {
long quot;
long rem;
} ldiv_t;
extern ldiv_t ldiv(long num, long denom);
extern __inline__ int abs(int __x) __ATTR_CONST__;
extern __inline__ int
abs(int __x)
{
return (__x < 0) ? -__x : __x;
}
extern __inline__ long labs(long __x) __ATTR_CONST__;
extern __inline__ long
labs(long __x)
{
return (__x < 0) ? -__x : __x;
}
long strtol(const char *, char **, int);
unsigned long strtoul(const char *, char **, int);
int atoi(const char *p);
long atol(const char *p);
char *itoa(int num, char *str, int radix);
char *utoa(unsigned num, char *str, int radix);
char *ltoa(long num, char *str, int radix);
char *ultoa(unsigned long num, char *str, int radix);
void *malloc(size_t size);
void free (void *p);
void * bsearch(const void *, const void *, size_t, size_t, register int
(*compar)(const void *, const void *));
#ifndef RAND_MAX
#define RAND_MAX 0x7fffffffL
#endif
int rand(void);
void srand(unsigned __seed);
int rand_r(unsigned *__seed);
#endif
#
# MSP430 libc
#
# $Id: Makefile,v 1.41 2004/07/08 19:01:14 coppice Exp $
#
VERSION = 20030812
# installation prefix (set this if you don't install by hand)
prefix = /usr/local/msp430
# name of target architecture (used for conform naming)
target = msp430
prefix_target = ${prefix}/${target}
bindir = ${prefix_target}/bin
includedir = ${prefix_target}/include
libdir = ${prefix_target}/lib
srcdir = .
CC = ${target}-gcc
AS = ${target}-gcc -x assembler-with-cpp
AR = ${target}-ar
RM = rm
MD = mkdir -p $@
INSTALL = install -c -m644 $^/
ASFLAGS = -Wa,-gstabs -D_GNU_ASSEMBLER_
CFLAGS = -Wall -O2 -g -v
# make sure we can find our header files (not the installed ones)
ALL_ASFLAGS += -I$(srcdir)/../include -I$(srcdir) ${ASFLAGS}
ALL_CFLAGS += -I$(srcdir)/../include -I$(srcdir) ${CFLAGS}
opt_speed_cflags = -O2
# further declaration...
ifdef gnu
source_dirs = gnu
else
source_dirs = bsd
endif
source_dirs =
VPATH = $(addprefix $(srcdir)/, $(source_dirs))
all: build-crt build-libc build-libm
install: install-crt install-libc install-headers install-libm
clean: clean-crt clean-libc clean-libm
crt_all_objs = \
crt430x110.o crt430x112.o \
crt430x1101.o crt430x1111.o crt430x1121.o \
crt430x1122.o crt430x1132.o \
crt430x122.o crt430x123.o \
crt430x1222.o crt430x1232.o \
crt430x133.o crt430x135.o \
crt430x1331.o crt430x1351.o \
crt430x147.o crt430x148.o crt430x149.o \
crt430x1471.o crt430x1481.o crt430x1491.o \
crt430x155.o crt430x156.o crt430x157.o \
crt430x167.o crt430x168.o crt430x169.o crt430x1610.o crt430x1611.o
crt430x1612.o \
crt430x311.o crt430x312.o crt430x313.o crt430x314.o crt430x315.o \
crt430x323.o crt430x325.o crt430x336.o crt430x337.o \
crt430x412.o crt430x413.o crt430x415.o crt430x417.o \
crt430xE423.o crt430xE425.o crt430xE427.o \
crt430xW423.o crt430xW425.o crt430xW427.o \
crt430xG437.o crt430xG438.o crt430xG439.o \
crt430x435.o crt430x436.o crt430x437.o \
crt430x447.o crt430x448.o crt430x449.o
build-crt: ${crt_all_objs}
# match by name
${crt_all_objs}: crt%.o: gcrt0.S
${AS} ${CPPFLAGS} -mmcu=msp$* ${ALL_ASFLAGS} -c $(ABSPATH)$< -o $@
clean-crt:
${RM} -f ${crt_all_objs}
install-crt: ${crt_all_objs} ${libdir}
${INSTALL}
#--------------- a bit of libc
libc_libs = msp1/libc.a msp2/libc.a
libc_c_sources = abs.c atol.c bsearch.c errno.c labs.c \
_init_section__.c malloc.c atoi.c strtol.c strtoul.c \
sprintf.c snprintf.c vsprintf.c vsnprintf.c \
printf.c vprintf.c vuprintf.c uprintf.c puts.c \
rand.c itoa.c ltoa.c utoa.c ultoa.c
libc_asm_sources = abort.S div.S exit.S ldiv.S setjmp.S
libc_str_sources = \
isascii.c memccpy.c strchr.c strncat.c swab.c \
isblank.c memchr.c strcmp.c strncmp.c toascii.c \
bcmp.c iscntrl.c memcmp.c strcpy.c strncpy.c tolower.c \
bcopy.c isdigit.c memcpy.c strcspn.c strpbrk.c toupper.c \
bzero.c islower.c memmove.c strdup.c strrchr.c \
ffs.c isprint.c memset.c strlcat.c strsep.c \
index.c isspace.c rindex.c strlcpy.c strspn.c \
isalnum.c isupper.c strcasecmp.c strlen.c strstr.c \
isalpha.c isxdigit.c strcat.c strncasecmp.c strtok.c \
ispunct.c
libc_msp430_ct_objs_1 = ${libc_c_sources:%.c=%.o}
libc_msp430_ct_objs_2 = ${libc_c_sources:%.c=%.o}
libc_msp430_asmt_objs_1 = ${libc_asm_sources:%.S=%.o}
libc_msp430_asmt_objs_2 = ${libc_asm_sources:%.S=%.o}
libc_msp430_c_objs_1 = $(addprefix msp1/, $(libc_msp430_ct_objs_1))
libc_msp430_c_objs_2 = $(addprefix msp2/, $(libc_msp430_ct_objs_2))
libc_msp430_S_objs_1 = $(addprefix msp1/, $(libc_msp430_asmt_objs_1))
libc_msp430_S_objs_2 = $(addprefix msp2/, $(libc_msp430_asmt_objs_2))
libc_msp430_objs_1 = ${libc_msp430_c_objs_1}
libc_msp430_objs_2 = ${libc_msp430_c_objs_2}
build-libc: ${libc_libs}
${libc_msp430_objs_1}: msp1/%.o: stdlib/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp1 -c $(ABSPATH)$< -o $@
${libc_msp430_objs_2}: msp2/%.o: stdlib/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp2 -c $(ABSPATH)$< -o $@
${libc_msp430_S_objs_1}: msp1/%.o: stdlib/%.S
${AS} -D_GNU_ASSEMBLER_ -mmcu=msp1 -c $(ABSPATH)$< -o $@
${libc_msp430_S_objs_2}: msp2/%.o: stdlib/%.S
${AS} -D_GNU_ASSEMBLER_ -mmcu=msp2 -c $(ABSPATH)$< -o $@
libc_msp430_cstr_objs_1 = ${libc_str_sources:%.c=%.o}
libc_msp430_cstr_objs_2 = ${libc_str_sources:%.c=%.o}
libc_msp430_str_objs_1 = $(addprefix msp1/, $(libc_msp430_cstr_objs_1))
libc_msp430_str_objs_2 = $(addprefix msp2/, $(libc_msp430_cstr_objs_2))
${libc_msp430_str_objs_1}: msp1/%.o: string/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp1 -c $(ABSPATH)$< -o $@
${libc_msp430_str_objs_2}: msp2/%.o: string/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp2 -c $(ABSPATH)$< -o $@
all_objs1 = ${libc_msp430_objs_1} ${libc_msp430_str_objs_1}
${libc_msp430_S_objs_1}
all_objs2 = ${libc_msp430_objs_2} ${libc_msp430_str_objs_2}
${libc_msp430_S_objs_2}
msp1/libc.a: ${all_objs1}
${AR} rc $@ $?
msp2/libc.a: ${all_objs2}
${AR} rc $@ $?
.PHONY: clean-libc
clean-libc:
${RM} -f msp1/libc.a msp2/libc.a msp1/*.o msp2/*.o
install-libc: ins-msp1 ins-msp2 ins-lib
ins-msp1: msp1/libc.a ${libdir}/msp1
${INSTALL}
ins-msp2: msp2/libc.a ${libdir}/msp2
${INSTALL}
ins-lib: msp1/libc.a ${libdir}
${INSTALL}
#--------------- headers ---------------
install-headers: ins-hr ins-hs ins-msp430
ins-hr: $(wildcard $(srcdir)/../include/*.h) ${includedir}
${INSTALL}
ins-hs: $(wildcard $(srcdir)/../include/sys/*.h) ${includedir}/sys
${INSTALL}
ins-msp430: $(wildcard $(srcdir)/../include/msp430/*.h) ${includedir}/msp430
${INSTALL}
fix-limits: $(wildcard $(srcdir)/../include/limits.h)
${includedir}/../../lib/gcc-lib/msp430/3.0/include
${INSTALL}
#--------------- directories ---------------
libc_dirs = msp1 msp2
install_lib_dirs = $(libdir) $(libdir)/msp1 $(libdir)/msp2
$(libc_dirs) $(install_lib_dirs) $(includedir) $(includedir)/sys
$(includedir)/msp430:
$(MD)
#------------------------------------------------------------------------
#------------------------------------------------------------------------
#------------------------------------------------------------------------
#------------------------------------------------------------------------
#-------------- Math & FP libs ---------------
math: build-libm
basic_fp = divsf.c fixsfsi.c floatdisf.c gtsf.c mulsf.c \
addsf.c eqsf.c fixunssfdi.c floatsisf.c lesf.c negsf.c \
cmpsf.c fixsfdi.c fixunssfsi.c gesf.c ltsf.c subsf.c nesf.c
fppfunc = ef_acos.c ef_hypot.c ef_remainder.c kf_sin.c sf_erf.c sf_isinf.c
sf_rint.c \
ef_acosh.c ef_j0.c ef_scalb.c kf_tan.c sf_expm1.c sf_isnan.c sf_scalbn.c \
ef_asin.c ef_j1.c ef_sinh.c sf_asinh.c sf_fabs.c sf_ldexp.c sf_signif.c \
ef_atan2.c ef_jn.c ef_sqrt.c sf_atan.c sf_finite.c sf_log1p.c sf_sin.c \
ef_atanh.c ef_log.c erf_gamma.c sf_cbrt.c sf_floor.c sf_logb.c sf_tan.c \
ef_cosh.c ef_log10.c erf_lgamma.c sf_ceil.c sf_frexp.c sf_modf.c sf_tanh.c \
ef_exp.c ef_pow.c kf_cos.c sf_copysign.c sf_ilogb.c sf_nan.c \
ef_fmod.c ef_rem_pio2.c kf_rem_pio2.c sf_cos.c sf_infinity.c sf_nextafter.c
libm_libs = msp1/libm.a msp2/libm.a msp1/libfp.a msp2/libfp.a
libm_msp430_fp_objs_1 = ${basic_fp:%.c=%.o}
libm_msp430_fp_objs_2 = ${basic_fp:%.c=%.o}
libm_msp430_fc_objs_1 = ${fppfunc:%.c=%.o}
libm_msp430_fc_objs_2 = ${fppfunc:%.c=%.o}
libm_msp430_c_objs_1 = $(addprefix msp1/, $(libm_msp430_fp_objs_1))
libm_msp430_c_objs_2 = $(addprefix msp2/, $(libm_msp430_fp_objs_2))
libm_msp430_cf_objs_1 = $(addprefix msp1/, $(libm_msp430_fc_objs_1))
libm_msp430_cf_objs_2 = $(addprefix msp2/, $(libm_msp430_fc_objs_2))
build-libm: ${libm_libs}
${libm_msp430_c_objs_1}: msp1/%.o: libm/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp1 -c $(ABSPATH)$< -o $@
${libm_msp430_c_objs_2}: msp2/%.o: libm/%.c
${CC} -c ${CPPFLAGS} ${ALL_CFLAGS} -mmcu=msp2 -c $(ABSPATH)$< -o $@
${libm_msp430_cf_objs_1}: msp1/%.o: libm/%.c
${CC} ${CPPFLAGS} -mmcu=msp1 ${ALL_CFLAGS} -c $(ABSPATH)$< -o $@
${libm_msp430_cf_objs_2}: msp2/%.o: libm/%.c
${CC} ${CPPFLAGS} -mmcu=msp2 ${ALL_CFLAGS} -c $(ABSPATH)$< -o $@
allm_objs1 = ${libm_msp430_cf_objs_1}
allm_objs2 = ${libm_msp430_cf_objs_2}
msp1/libm.a: ${allm_objs1}
${AR} rc $@ $?
msp2/libm.a: ${allm_objs2}
${AR} rc $@ $?
msp1/libfp.a:${libm_msp430_c_objs_1}
${AR} rc $@ $?
msp2/libfp.a:${libm_msp430_c_objs_2}
${AR} rc $@ $?
install-libm: insm-msp1 insm-msp2 insm-lib
insm-msp1: msp1/libm.a msp1/libfp.a ${libdir}/msp1
${INSTALL}
insm-msp2: msp2/libm.a msp2/libfp.a ${libdir}/msp2
${INSTALL}
insm-lib: msp1/libm.a ${libdir}
${INSTALL}
.PHONY: clean-libm
clean-libm:
${RM} -f msp1/libm.a msp2/libm.a msp1/libfp.a msp2/libfp.a msp1/*.o
msp2/*.o
/*******************************************************
* Code contributed by Chris Takahashi, *
* ctakahashi (at) users (dot) sourceforge (dot) net. *
* See stdlib.h for licence. *
* $Date: 2004/07/02 19:09:31 $ *
*******************************************************/
#include <stdlib.h>
char *ultoa(unsigned long num, char *str, int radix) {
char temp[33]; //an int can only be 16 bits long
//at radix 2 (binary) the string
//is at most 16 + 1 null long.
int temp_loc = 0;
int digit;
int str_loc = 0;
//construct a backward string of the number.
do {
digit = (unsigned int)num % radix;
if (digit < 10)
temp[temp_loc++] = digit + '0';
else
temp[temp_loc++] = digit - 10 + 'A';
((unsigned int)num) /= radix;
} while ((unsigned int)num > 0);
temp_loc--;
//now reverse the string.
while ( temp_loc >=0 ) {// while there are still chars
str[str_loc++] = temp[temp_loc--];
}
str[str_loc] = 0; // add null termination.
return str;
}
/*******************************************************
* Code contributed by Chris Takahashi, *
* ctakahashi (at) users (dot) sourceforge (dot) net. *
* See stdlib.h for licence. *
* $Date: 2004/07/02 19:09:31 $ *
*******************************************************/
#include <stdlib.h>
char *utoa(unsigned num, char *str, int radix) {
char temp[17]; //an int can only be 16 bits long
//at radix 2 (binary) the string
//is at most 16 + 1 null long.
int temp_loc = 0;
int digit;
int str_loc = 0;
//construct a backward string of the number.
do {
digit = (unsigned int)num % radix;
if (digit < 10)
temp[temp_loc++] = digit + '0';
else
temp[temp_loc++] = digit - 10 + 'A';
((unsigned int)num) /= radix;
} while ((unsigned int)num > 0);
temp_loc--;
//now reverse the string.
while ( temp_loc >=0 ) {// while there are still chars
str[str_loc++] = temp[temp_loc--];
}
str[str_loc] = 0; // add null termination.
return str;
}
/*******************************************************
* Code contributed by Chris Takahashi, *
* ctakahashi (at) users (dot) sourceforge (dot) net. *
* See stdlib.h for licence. *
* $Date: 2004/07/02 19:09:31 $ *
*******************************************************/
#include <stdlib.h>
char *itoa(int num, char *str, int radix) {
char sign = 0;
char temp[17]; //an int can only be 16 bits long
//at radix 2 (binary) the string
//is at most 16 + 1 null long.
int temp_loc = 0;
int digit;
int str_loc = 0;
//save sign for radix 10 conversion
if (radix == 10 && num < 0) {
sign = 1;
num = -num;
}
//construct a backward string of the number.
do {
digit = (unsigned int)num % radix;
if (digit < 10)
temp[temp_loc++] = digit + '0';
else
temp[temp_loc++] = digit - 10 + 'A';
((unsigned int)num) /= radix;
} while ((unsigned int)num > 0);
//now add the sign for radix 10
if (radix == 10 && sign) {
temp[temp_loc] = '-';
} else {
temp_loc--;
}
//now reverse the string.
while ( temp_loc >=0 ) {// while there are still chars
str[str_loc++] = temp[temp_loc--];
}
str[str_loc] = 0; // add null termination.
return str;
}
/*******************************************************
* Code contributed by Chris Takahashi, *
* ctakahashi (at) users (dot) sourceforge (dot) net. *
* See stdlib.h for licence. *
* $Date: 2004/07/02 19:09:31 $ *
*******************************************************/
#include <stdlib.h>
char *ltoa(long num, char *str, int radix) {
char sign = 0;
char temp[33]; //an int can only be 32 bits long
//at radix 2 (binary) the string
//is at most 16 + 1 null long.
int temp_loc = 0;
int digit;
int str_loc = 0;
//save sign for radix 10 conversion
if (radix == 10 && num < 0) {
sign = 1;
num = -num;
}
//construct a backward string of the number.
do {
digit = (unsigned int)num % radix;
if (digit < 10)
temp[temp_loc++] = digit + '0';
else
temp[temp_loc++] = digit - 10 + 'A';
((unsigned int)num) /= radix;
} while ((unsigned int)num > 0);
//now add the sign for radix 10
if (radix == 10 && sign) {
temp[temp_loc] = '-';
} else {
temp_loc--;
}
//now reverse the string.
while ( temp_loc >=0 ) {// while there are still chars
str[str_loc++] = temp[temp_loc--];
}
str[str_loc] = 0; // add null termination.
return str;
}