You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2015/11/24 01:54:46 UTC
[1/5] incubator-mynewt-larva git commit: BaseLibc as an egg.
Repository: incubator-mynewt-larva
Updated Branches:
refs/heads/master 9601758b7 -> c4017193c
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/test/unittests.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/test/unittests.h b/libs/baselibc/src/test/unittests.h
new file mode 100644
index 0000000..c2b470a
--- /dev/null
+++ b/libs/baselibc/src/test/unittests.h
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+#define COMMENT(x) printf("\n----" x "----\n");
+#define STR(x) #x
+#define STR2(x) STR(x)
+#define TEST(x) \
+ if (!(x)) { \
+ fprintf(stderr, "\033[31;1mFAILED:\033[22;39m " __FILE__ ":" STR2(__LINE__) " " #x "\n"); \
+ status = 1; \
+ } else { \
+ printf("\033[32;1mOK:\033[22;39m " #x "\n"); \
+ }
+
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/tinyprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/tinyprintf.c b/libs/baselibc/src/tinyprintf.c
new file mode 100644
index 0000000..c0c48da
--- /dev/null
+++ b/libs/baselibc/src/tinyprintf.c
@@ -0,0 +1,371 @@
+/*
+File: tinyprintf.c
+
+Copyright (C) 2004 Kustaa Nyholm
+Copyright (C) 2010 CJlano
+Copyright (C) 2011 Petteri Aimonen
+
+This file is dual-licensed. You can use either of these licenses:
+
+1) GNU LGPL
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+2) BSD
+Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+
+*/
+
+/* This is a smaller implementation of printf-family of functions,
+ * based on tinyprintf code by Kustaa Nyholm.
+ * The formats supported by this implementation are: 'd' 'u' 'c' 's' 'x' 'X'.
+ * Zero padding and field width are also supported.
+ * If the library is compiled with 'PRINTF_SUPPORT_LONG' defined then the
+ * long specifier is also supported.
+ * Otherwise it is ignored, so on 32 bit platforms there is no point to use
+ * PRINTF_SUPPORT_LONG because int == long.
+ */
+
+#include <stdio.h>
+
+struct param {
+ int width; /**< field width */
+ char lz; /**< Leading zeros */
+ char sign; /**< The sign to display (if any) */
+ char alt; /**< alternate form */
+ char base; /**< number base (e.g.: 8, 10, 16) */
+ char uc; /**< Upper case (for base16 only) */
+ char *bf; /**< Buffer to output */
+};
+
+#ifdef PRINTF_LONG_SUPPORT
+
+static void uli2a(unsigned long int num, struct param *p)
+{
+ int n = 0;
+ unsigned long int d = 1;
+ char *bf = p->bf;
+ while (num / d >= p->base)
+ d *= p->base;
+ while (d != 0) {
+ int dgt = num / d;
+ num %= d;
+ d /= p->base;
+ if (n || dgt > 0 || d == 0) {
+ *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
+ ++n;
+ }
+ }
+ *bf = 0;
+}
+
+static void li2a(long num, struct param *p)
+{
+ if (num < 0) {
+ num = -num;
+ p->sign = '-';
+ }
+ uli2a(num, p);
+}
+#endif
+
+static void ui2a(unsigned int num, struct param *p)
+{
+ int n = 0;
+ unsigned int d = 1;
+ char *bf = p->bf;
+ while (num / d >= p->base)
+ d *= p->base;
+ while (d != 0) {
+ int dgt = num / d;
+ num %= d;
+ d /= p->base;
+ if (n || dgt > 0 || d == 0) {
+ *bf++ = dgt + (dgt < 10 ? '0' : (p->uc ? 'A' : 'a') - 10);
+ ++n;
+ }
+ }
+ *bf = 0;
+}
+
+static void i2a(int num, struct param *p)
+{
+ if (num < 0) {
+ num = -num;
+ p->sign = '-';
+ }
+ ui2a(num, p);
+}
+
+static int a2d(char ch)
+{
+ if (ch >= '0' && ch <= '9')
+ return ch - '0';
+ else if (ch >= 'a' && ch <= 'f')
+ return ch - 'a' + 10;
+ else if (ch >= 'A' && ch <= 'F')
+ return ch - 'A' + 10;
+ else
+ return -1;
+}
+
+static char a2i(char ch, const char **src, int base, int *nump)
+{
+ const char *p = *src;
+ int num = 0;
+ int digit;
+ while ((digit = a2d(ch)) >= 0) {
+ if (digit > base)
+ break;
+ num = num * base + digit;
+ ch = *p++;
+ }
+ *src = p;
+ *nump = num;
+ return ch;
+}
+
+static int putf(FILE *putp, char c)
+{
+ if (fputc(c, putp) == EOF)
+ return 0;
+ else
+ return 1;
+}
+
+static unsigned putchw(FILE *putp, struct param *p)
+{
+ unsigned written = 0;
+ char ch;
+ int n = p->width;
+ char *bf = p->bf;
+
+ /* Number of filling characters */
+ while (*bf++ && n > 0)
+ n--;
+ if (p->sign)
+ n--;
+ if (p->alt && p->base == 16)
+ n -= 2;
+ else if (p->alt && p->base == 8)
+ n--;
+
+ /* Fill with space, before alternate or sign */
+ if (!p->lz) {
+ while (n-- > 0)
+ written += putf(putp, ' ');
+ }
+
+ /* print sign */
+ if (p->sign)
+ written += putf(putp, p->sign);
+
+ /* Alternate */
+ if (p->alt && p->base == 16) {
+ written += putf(putp, '0');
+ written += putf(putp, (p->uc ? 'X' : 'x'));
+ } else if (p->alt && p->base == 8) {
+ written += putf(putp, '0');
+ }
+
+ /* Fill with zeros, after alternate or sign */
+ if (p->lz) {
+ while (n-- > 0)
+ written += putf(putp, '0');
+ }
+
+ /* Put actual buffer */
+ bf = p->bf;
+ while ((ch = *bf++))
+ written += putf(putp, ch);
+
+ return written;
+}
+
+size_t tfp_format(FILE *putp, const char *fmt, va_list va)
+{
+ size_t written = 0;
+ struct param p;
+#ifdef PRINTF_LONG_SUPPORT
+ char bf[23];
+#else
+ char bf[12];
+#endif
+ p.bf = bf;
+
+ char ch;
+
+ while ((ch = *(fmt++))) {
+ if (ch != '%') {
+ written += putf(putp, ch);
+ } else {
+ /* Init parameter struct */
+ p.lz = 0;
+ p.alt = 0;
+ p.width = 0;
+ p.sign = 0;
+#ifdef PRINTF_LONG_SUPPORT
+ char lng = 0;
+#endif
+
+ /* Flags */
+ while ((ch = *(fmt++))) {
+ switch (ch) {
+ case '0':
+ p.lz = 1;
+ continue;
+ case '#':
+ p.alt = 1;
+ continue;
+ default:
+ break;
+ }
+ break;
+ }
+
+ /* Width */
+ if (ch >= '0' && ch <= '9') {
+ ch = a2i(ch, &fmt, 10, &(p.width));
+ }
+ if (ch == 'l') {
+ ch = *(fmt++);
+#ifdef PRINTF_LONG_SUPPORT
+ lng = 1;
+#endif
+ }
+
+ switch (ch) {
+ case 0:
+ goto abort;
+ case 'u':
+ p.base = 10;
+#ifdef PRINTF_LONG_SUPPORT
+ if (lng)
+ uli2a(va_arg(va, unsigned long int), &p);
+ else
+#endif
+ ui2a(va_arg(va, unsigned int), &p);
+ written += putchw(putp, &p);
+ break;
+ case 'd':
+ case 'i':
+ p.base = 10;
+#ifdef PRINTF_LONG_SUPPORT
+ if (lng)
+ li2a(va_arg(va, unsigned long int), &p);
+ else
+#endif
+ i2a(va_arg(va, int), &p);
+ written += putchw(putp, &p);
+ break;
+ case 'x':
+ case 'X':
+ p.base = 16;
+ p.uc = (ch == 'X');
+#ifdef PRINTF_LONG_SUPPORT
+ if (lng)
+ uli2a(va_arg(va, unsigned long int), &p);
+ else
+#endif
+ ui2a(va_arg(va, unsigned int), &p);
+ written += putchw(putp, &p);
+ break;
+ case 'o':
+ p.base = 8;
+ ui2a(va_arg(va, unsigned int), &p);
+ written += putchw(putp, &p);
+ break;
+ case 'c':
+ written += putf(putp, (char)(va_arg(va, int)));
+ break;
+ case 's':
+ p.bf = va_arg(va, char *);
+ written += putchw(putp, &p);
+ p.bf = bf;
+ break;
+ case '%':
+ written += putf(putp, ch);
+ default:
+ break;
+ }
+ }
+ }
+ abort:;
+
+ return written;
+}
+
+int vfprintf(FILE *f, const char *fmt, va_list va)
+{
+ return tfp_format(f, fmt, va);
+}
+
+int fprintf(FILE *f, const char *fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ int rv = vfprintf(f, fmt, va);
+ va_end(va);
+ return rv;
+}
+
+int printf(const char *fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ int rv = vfprintf(stdout, fmt, va);
+ va_end(va);
+ return rv;
+}
+
+int vsnprintf(char *str, size_t size, const char *fmt, va_list va)
+{
+ struct MemFile state;
+ FILE *f = fmemopen_w(&state, str, size - 1);
+ tfp_format(f, fmt, va);
+ *(state.buffer) = '\0';
+ return state.bytes_written;
+}
+
+int snprintf(char *str, size_t size, const char *fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ int rv = vsnprintf(str, size, fmt, va);
+ va_end(va);
+ return rv;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/vasprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/vasprintf.c b/libs/baselibc/src/vasprintf.c
new file mode 100644
index 0000000..cdc302f
--- /dev/null
+++ b/libs/baselibc/src/vasprintf.c
@@ -0,0 +1,25 @@
+/*
+ * vasprintf.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int vasprintf(char **bufp, const char *format, va_list ap)
+{
+ va_list ap1;
+ int bytes;
+ char *p;
+
+ va_copy(ap1, ap);
+
+ bytes = vsnprintf(NULL, 0, format, ap1) + 1;
+ va_end(ap1);
+
+ *bufp = p = malloc(bytes);
+ if (!p)
+ return -1;
+
+ return vsnprintf(p, bytes, format, ap);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/vprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/vprintf.c b/libs/baselibc/src/vprintf.c
new file mode 100644
index 0000000..d6bfeaf
--- /dev/null
+++ b/libs/baselibc/src/vprintf.c
@@ -0,0 +1,11 @@
+/*
+ * vprintf.c
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+int vprintf(const char *format, va_list ap)
+{
+ return vfprintf(stdout, format, ap);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/vsprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/vsprintf.c b/libs/baselibc/src/vsprintf.c
new file mode 100644
index 0000000..51f5d87
--- /dev/null
+++ b/libs/baselibc/src/vsprintf.c
@@ -0,0 +1,11 @@
+/*
+ * vsprintf.c
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+int vsprintf(char *buffer, const char *format, va_list ap)
+{
+ return vsnprintf(buffer, ~(size_t) 0, format, ap);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/vsscanf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/vsscanf.c b/libs/baselibc/src/vsscanf.c
new file mode 100644
index 0000000..60eaca6
--- /dev/null
+++ b/libs/baselibc/src/vsscanf.c
@@ -0,0 +1,400 @@
+/*
+ * vsscanf.c
+ *
+ * vsscanf(), from which the rest of the scanf()
+ * family is built
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <inttypes.h>
+#include <string.h>
+#include <limits.h>
+#include <stdio.h>
+
+#ifndef LONG_BIT
+#define LONG_BIT (CHAR_BIT*sizeof(long))
+#endif
+
+enum flags {
+ FL_SPLAT = 0x01, /* Drop the value, do not assign */
+ FL_INV = 0x02, /* Character-set with inverse */
+ FL_WIDTH = 0x04, /* Field width specified */
+ FL_MINUS = 0x08, /* Negative number */
+};
+
+enum ranks {
+ rank_char = -2,
+ rank_short = -1,
+ rank_int = 0,
+ rank_long = 1,
+ rank_longlong = 2,
+ rank_ptr = INT_MAX /* Special value used for pointers */
+};
+
+#define MIN_RANK rank_char
+#define MAX_RANK rank_longlong
+
+#define INTMAX_RANK rank_longlong
+#define SIZE_T_RANK rank_long
+#define PTRDIFF_T_RANK rank_long
+
+enum bail {
+ bail_none = 0, /* No error condition */
+ bail_eof, /* Hit EOF */
+ bail_err /* Conversion mismatch */
+};
+
+static inline const char *skipspace(const char *p)
+{
+ while (isspace((unsigned char)*p))
+ p++;
+ return p;
+}
+
+#undef set_bit
+static inline void set_bit(unsigned long *bitmap, unsigned int bit)
+{
+ bitmap[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
+}
+
+#undef test_bit
+static inline int test_bit(unsigned long *bitmap, unsigned int bit)
+{
+ return (int)(bitmap[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1;
+}
+
+int vsscanf(const char *buffer, const char *format, va_list ap)
+{
+ const char *p = format;
+ char ch;
+ unsigned char uc;
+ const char *q = buffer;
+ const char *qq;
+ uintmax_t val = 0;
+ int rank = rank_int; /* Default rank */
+ unsigned int width = UINT_MAX;
+ int base;
+ enum flags flags = 0;
+ enum {
+ st_normal, /* Ground state */
+ st_flags, /* Special flags */
+ st_width, /* Field width */
+ st_modifiers, /* Length or conversion modifiers */
+ st_match_init, /* Initial state of %[ sequence */
+ st_match, /* Main state of %[ sequence */
+ st_match_range, /* After - in a %[ sequence */
+ } state = st_normal;
+ char *sarg = NULL; /* %s %c or %[ string argument */
+ enum bail bail = bail_none;
+ int sign;
+ int converted = 0; /* Successful conversions */
+ unsigned long matchmap[((1 << CHAR_BIT) + (LONG_BIT - 1)) / LONG_BIT];
+ int matchinv = 0; /* Is match map inverted? */
+ unsigned char range_start = 0;
+ (void)sign;
+
+ while ((ch = *p++) && !bail) {
+ switch (state) {
+ case st_normal:
+ if (ch == '%') {
+ state = st_flags;
+ flags = 0;
+ rank = rank_int;
+ width = UINT_MAX;
+ } else if (isspace((unsigned char)ch)) {
+ q = skipspace(q);
+ } else {
+ if (*q == ch)
+ q++;
+ else
+ bail = bail_err; /* Match failure */
+ }
+ break;
+
+ case st_flags:
+ switch (ch) {
+ case '*':
+ flags |= FL_SPLAT;
+ break;
+ case '0'...'9':
+ width = (ch - '0');
+ state = st_width;
+ flags |= FL_WIDTH;
+ break;
+ default:
+ state = st_modifiers;
+ p--; /* Process this character again */
+ break;
+ }
+ break;
+
+ case st_width:
+ if (ch >= '0' && ch <= '9') {
+ width = width * 10 + (ch - '0');
+ } else {
+ state = st_modifiers;
+ p--; /* Process this character again */
+ }
+ break;
+
+ case st_modifiers:
+ switch (ch) {
+ /* Length modifiers - nonterminal sequences */
+ case 'h':
+ rank--; /* Shorter rank */
+ break;
+ case 'l':
+ rank++; /* Longer rank */
+ break;
+ case 'j':
+ rank = INTMAX_RANK;
+ break;
+ case 'z':
+ rank = SIZE_T_RANK;
+ break;
+ case 't':
+ rank = PTRDIFF_T_RANK;
+ break;
+ case 'L':
+ case 'q':
+ rank = rank_longlong; /* long double/long long */
+ break;
+
+ default:
+ /* Output modifiers - terminal sequences */
+ /* Next state will be normal */
+ state = st_normal;
+
+ /* Canonicalize rank */
+ if (rank < MIN_RANK)
+ rank = MIN_RANK;
+ else if (rank > MAX_RANK)
+ rank = MAX_RANK;
+
+ switch (ch) {
+ case 'P': /* Upper case pointer */
+ case 'p': /* Pointer */
+ rank = rank_ptr;
+ base = 0;
+ sign = 0;
+ goto scan_int;
+
+ case 'i': /* Base-independent integer */
+ base = 0;
+ sign = 1;
+ goto scan_int;
+
+ case 'd': /* Decimal integer */
+ base = 10;
+ sign = 1;
+ goto scan_int;
+
+ case 'o': /* Octal integer */
+ base = 8;
+ sign = 0;
+ goto scan_int;
+
+ case 'u': /* Unsigned decimal integer */
+ base = 10;
+ sign = 0;
+ goto scan_int;
+
+ case 'x': /* Hexadecimal integer */
+ case 'X':
+ base = 16;
+ sign = 0;
+ goto scan_int;
+
+ case 'n': /* # of characters consumed */
+ val = (q - buffer);
+ goto set_integer;
+
+ scan_int:
+ q = skipspace(q);
+ if (!*q) {
+ bail = bail_eof;
+ break;
+ }
+ val =
+ strntoumax(q, (char **)&qq, base,
+ width);
+ if (qq == q) {
+ bail = bail_err;
+ break;
+ }
+ q = qq;
+ if (!(flags & FL_SPLAT))
+ converted++;
+ /* fall through */
+
+ set_integer:
+ if (!(flags & FL_SPLAT)) {
+ switch (rank) {
+ case rank_char:
+ *va_arg(ap,
+ unsigned char *)
+ = val;
+ break;
+ case rank_short:
+ *va_arg(ap,
+ unsigned short
+ *) = val;
+ break;
+ case rank_int:
+ *va_arg(ap,
+ unsigned int *)
+ = val;
+ break;
+ case rank_long:
+ *va_arg(ap,
+ unsigned long *)
+ = val;
+ break;
+ case rank_longlong:
+ *va_arg(ap,
+ unsigned long
+ long *) = val;
+ break;
+ case rank_ptr:
+ *va_arg(ap, void **) =
+ (void *)
+ (uintptr_t)val;
+ break;
+ }
+ }
+ break;
+
+ case 'c': /* Character */
+ /* Default width == 1 */
+ width = (flags & FL_WIDTH) ? width : 1;
+ if (flags & FL_SPLAT) {
+ while (width--) {
+ if (!*q) {
+ bail = bail_eof;
+ break;
+ }
+ }
+ } else {
+ sarg = va_arg(ap, char *);
+ while (width--) {
+ if (!*q) {
+ bail = bail_eof;
+ break;
+ }
+ *sarg++ = *q++;
+ }
+ if (!bail)
+ converted++;
+ }
+ break;
+
+ case 's': /* String */
+ uc = 1; /* Anything nonzero */
+ if (flags & FL_SPLAT) {
+ while (width-- && (uc = *q) &&
+ !isspace(uc)) {
+ q++;
+ }
+ } else {
+ char *sp;
+ sp = sarg = va_arg(ap, char *);
+ while (width-- && (uc = *q) &&
+ !isspace(uc)) {
+ *sp++ = uc;
+ q++;
+ }
+ if (sarg != sp) {
+ /* Terminate output */
+ *sp = '\0';
+ converted++;
+ }
+ }
+ if (!uc)
+ bail = bail_eof;
+ break;
+
+ case '[': /* Character range */
+ sarg = (flags & FL_SPLAT) ? NULL
+ : va_arg(ap, char *);
+ state = st_match_init;
+ matchinv = 0;
+ memset(matchmap, 0, sizeof matchmap);
+ break;
+
+ case '%': /* %% sequence */
+ if (*q == '%')
+ q++;
+ else
+ bail = bail_err;
+ break;
+
+ default: /* Anything else */
+ /* Unknown sequence */
+ bail = bail_err;
+ break;
+ }
+ }
+ break;
+
+ case st_match_init: /* Initial state for %[ match */
+ if (ch == '^' && !(flags & FL_INV)) {
+ matchinv = 1;
+ } else {
+ set_bit(matchmap, (unsigned char)ch);
+ state = st_match;
+ }
+ break;
+
+ case st_match: /* Main state for %[ match */
+ if (ch == ']') {
+ goto match_run;
+ } else if (ch == '-') {
+ range_start = (unsigned char)ch;
+ state = st_match_range;
+ } else {
+ set_bit(matchmap, (unsigned char)ch);
+ }
+ break;
+
+ case st_match_range: /* %[ match after - */
+ if (ch == ']') {
+ /* - was last character */
+ set_bit(matchmap, (unsigned char)'-');
+ goto match_run;
+ } else {
+ int i;
+ for (i = range_start; i < (unsigned char)ch;
+ i++)
+ set_bit(matchmap, i);
+ state = st_match;
+ }
+ break;
+
+ match_run: /* Match expression finished */
+ qq = q;
+ uc = 1; /* Anything nonzero */
+ while (width && (uc = *q)
+ && test_bit(matchmap, uc)^matchinv) {
+ if (sarg)
+ *sarg++ = uc;
+ q++;
+ }
+ if (q != qq && sarg) {
+ *sarg = '\0';
+ converted++;
+ } else {
+ bail = bail_err;
+ }
+ if (!uc)
+ bail = bail_eof;
+ break;
+ }
+ }
+
+ if (bail == bail_eof && !converted)
+ converted = -1; /* Return EOF (-1) */
+
+ return converted;
+}
[5/5] incubator-mynewt-larva git commit: Clear flash status before
attempting write. Otherwise it'll fail before even attempting write. Don't
error in init if flash is already unlocked.
Posted by ma...@apache.org.
Clear flash status before attempting write. Otherwise it'll fail
before even attempting write.
Don't error in init if flash is already unlocked.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/c4017193
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/c4017193
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/c4017193
Branch: refs/heads/master
Commit: c4017193c1b08f057c51bb0e5fce6a4bd2d5a776
Parents: 8de028f
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Nov 23 16:51:18 2015 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Nov 23 16:51:18 2015 -0800
----------------------------------------------------------------------
hw/mcu/stm/stm32f4xx/src/hal_flash.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/c4017193/hw/mcu/stm/stm32f4xx/src/hal_flash.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_flash.c b/hw/mcu/stm/stm32f4xx/src/hal_flash.c
index b2922e7..ba93941 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_flash.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_flash.c
@@ -74,6 +74,11 @@ stm32f4_flash_write(uint32_t address, const void *src, uint32_t num_bytes)
int rc;
sptr = src;
+ /*
+ * Clear status of previous operation.
+ */
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \
+ FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR);
for (i = 0; i < num_bytes; i++) {
rc = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, sptr[i]);
if (rc != 0) {
@@ -110,12 +115,6 @@ stm32f4_flash_erase_sector(uint32_t sector_address)
static int
stm32f4_flash_init(void)
{
- int rc;
-
- rc = HAL_FLASH_Unlock();
- if (rc != 0) {
- return -1;
- }
-
+ HAL_FLASH_Unlock();
return 0;
}
[2/5] incubator-mynewt-larva git commit: BaseLibc as an egg.
Posted by ma...@apache.org.
BaseLibc as an egg.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/b32abb57
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/b32abb57
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/b32abb57
Branch: refs/heads/master
Commit: b32abb577f9de23d7018132958a3341f4ca2c5f1
Parents: 9601758
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Nov 23 14:45:37 2015 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Nov 23 14:45:37 2015 -0800
----------------------------------------------------------------------
libs/baselibc/LICENSE | 133 +++++++
libs/baselibc/Makefile | 46 +++
libs/baselibc/README.md | 6 +
libs/baselibc/egg.yml | 6 +
libs/baselibc/include/assert.h | 26 ++
libs/baselibc/include/ctype.h | 86 +++++
libs/baselibc/include/inttypes.h | 226 ++++++++++++
libs/baselibc/include/klibc/extern.h | 16 +
libs/baselibc/include/klibc/inline.h | 12 +
libs/baselibc/include/stdio.h | 124 +++++++
libs/baselibc/include/stdlib.h | 98 +++++
libs/baselibc/include/string.h | 59 +++
libs/baselibc/src/asprintf.c | 30 ++
libs/baselibc/src/atoi.c | 3 +
libs/baselibc/src/atol.c | 3 +
libs/baselibc/src/atoll.c | 3 +
libs/baselibc/src/bsearch.c | 26 ++
libs/baselibc/src/bzero.c | 6 +
libs/baselibc/src/calloc.c | 20 ++
libs/baselibc/src/fgets.c | 31 ++
libs/baselibc/src/inline.c | 5 +
libs/baselibc/src/jrand48.c | 24 ++
libs/baselibc/src/lrand48.c | 13 +
libs/baselibc/src/malloc.c | 274 ++++++++++++++
libs/baselibc/src/malloc.h | 43 +++
libs/baselibc/src/memccpy.c | 23 ++
libs/baselibc/src/memchr.c | 19 +
libs/baselibc/src/memcmp.c | 19 +
libs/baselibc/src/memcpy.c | 29 ++
libs/baselibc/src/memfile.c | 33 ++
libs/baselibc/src/memmem.c | 52 +++
libs/baselibc/src/memmove.c | 36 ++
libs/baselibc/src/memrchr.c | 19 +
libs/baselibc/src/memset.c | 30 ++
libs/baselibc/src/memswap.c | 24 ++
libs/baselibc/src/mrand48.c | 13 +
libs/baselibc/src/mynewt.c | 44 +++
libs/baselibc/src/nrand48.c | 11 +
libs/baselibc/src/qsort.c | 46 +++
libs/baselibc/src/realloc.c | 48 +++
libs/baselibc/src/sprintf.c | 18 +
libs/baselibc/src/srand48.c | 15 +
libs/baselibc/src/sscanf.c | 17 +
libs/baselibc/src/strcasecmp.c | 24 ++
libs/baselibc/src/strcat.c | 11 +
libs/baselibc/src/strchr.c | 17 +
libs/baselibc/src/strcmp.c | 21 ++
libs/baselibc/src/strcpy.c | 20 ++
libs/baselibc/src/strcspn.c | 51 +++
libs/baselibc/src/strdup.c | 17 +
libs/baselibc/src/strlcat.c | 30 ++
libs/baselibc/src/strlcpy.c | 26 ++
libs/baselibc/src/strlen.c | 13 +
libs/baselibc/src/strncasecmp.c | 24 ++
libs/baselibc/src/strncat.c | 21 ++
libs/baselibc/src/strncmp.c | 21 ++
libs/baselibc/src/strncpy.c | 24 ++
libs/baselibc/src/strndup.c | 19 +
libs/baselibc/src/strnlen.c | 18 +
libs/baselibc/src/strntoimax.c | 13 +
libs/baselibc/src/strntoumax.c | 77 ++++
libs/baselibc/src/strpbrk.c | 55 +++
libs/baselibc/src/strrchr.c | 19 +
libs/baselibc/src/strsep.c | 21 ++
libs/baselibc/src/strspn.c | 56 +++
libs/baselibc/src/strstr.c | 11 +
libs/baselibc/src/strtoimax.c | 3 +
libs/baselibc/src/strtok.c | 12 +
libs/baselibc/src/strtok_r.c | 13 +
libs/baselibc/src/strtol.c | 3 +
libs/baselibc/src/strtoll.c | 3 +
libs/baselibc/src/strtoul.c | 3 +
libs/baselibc/src/strtoull.c | 3 +
libs/baselibc/src/strtoumax.c | 3 +
libs/baselibc/src/templates/atox.c.template | 14 +
libs/baselibc/src/templates/strtox.c.template | 14 +
libs/baselibc/src/test/printf_tests.c | 22 ++
libs/baselibc/src/test/tests_glue.c | 33 ++
libs/baselibc/src/test/unittests.h | 14 +
libs/baselibc/src/tinyprintf.c | 371 +++++++++++++++++++
libs/baselibc/src/vasprintf.c | 25 ++
libs/baselibc/src/vprintf.c | 11 +
libs/baselibc/src/vsprintf.c | 11 +
libs/baselibc/src/vsscanf.c | 400 +++++++++++++++++++++
84 files changed, 3382 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/LICENSE
----------------------------------------------------------------------
diff --git a/libs/baselibc/LICENSE b/libs/baselibc/LICENSE
new file mode 100644
index 0000000..b791574
--- /dev/null
+++ b/libs/baselibc/LICENSE
@@ -0,0 +1,133 @@
+Baselibc is based on klibc 1.5.23 and tinyprintf modules.
+None of the GPL-licensed parts of klibc are used.
+
+Baselibc is licensed under the BSD license:
+
+Copyright (c) 2012 Petteri Aimonen <jpa at blc.mail.kapsi.fi>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+
+The original licenses of the modules are included below:
+
+------------------ Tinyprintf license ------------------
+
+Copyright (c) 2004,2012 Kustaa Nyholm / SpareTimeLabs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of Kustaa Nyholm or SpareTimeLabs nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+
+------------------- klibc license -------------------------
+This license applies to all files in directory and its subdirectories,
+unless otherwise noted in individual files.
+
+
+Some files are derived from files derived from the include/ directory
+of the Linux kernel, and are licensed under the terms of the GNU
+General Public License, version 2, as released by the Free Software
+Foundation, Inc.; incorporated herein by reference.
+[These files are not included in the baselibc.]
+
+ -----
+
+Some files are derived from files copyrighted by the Regents of The
+University of California, and are available under the following
+license:
+
+Note: The advertising clause in the license appearing on BSD Unix
+files was officially rescinded by the Director of the Office of
+Technology Licensing of the University of California on July 22
+1999. He states that clause 3 is "hereby deleted in its entirety."
+
+ * Copyright (c)
+ * The Regents of the University of California. 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+
+For all remaining files [of klibc], the following license applies:
+
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * Any copyright notice(s) and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/Makefile
----------------------------------------------------------------------
diff --git a/libs/baselibc/Makefile b/libs/baselibc/Makefile
new file mode 100644
index 0000000..88c8987
--- /dev/null
+++ b/libs/baselibc/Makefile
@@ -0,0 +1,46 @@
+# You can override the CFLAGS and C compiler externally,
+# e.g. make PLATFORM=cortex-m3
+CFLAGS += -g -Wall -Werror -I include
+
+ifeq ($(PLATFORM),cortex-m3)
+ CC = arm-none-eabi-gcc
+ AR = arm-none-eabi-ar
+ CFLAGS += -mcpu=cortex-m3 -mthumb
+ CFLAGS += -fno-common -Os
+ CFLAGS += -ffunction-sections -fdata-sections
+endif
+
+# With this, the makefile should work on Windows also.
+ifdef windir
+ RM = del
+endif
+
+# Just include all the source files in the build.
+CSRC = $(wildcard src/*.c)
+OBJS = $(CSRC:.c=.o)
+
+# And the files for the test suite
+TESTS_CSRC = $(wildcard tests/*_tests.c)
+TESTS_OBJS = $(TESTS_CSRC:.c=)
+
+# Some of the files uses "templates", i.e. common pieces
+# of code included from multiple files.
+CFLAGS += -Isrc/templates
+
+all: libc.a
+
+clean:
+ $(RM) $(OBJS) $(TESTS_OBJS) libc.a
+
+libc.a: $(OBJS)
+ $(RM) $@
+ $(AR) ru $@ $^
+
+run_tests: $(TESTS_OBJS)
+ $(foreach f,$^,$f)
+
+tests/%: tests/%.c tests/tests_glue.c libc.a
+ $(CC) $(CFLAGS) -o $@ $^
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/README.md
----------------------------------------------------------------------
diff --git a/libs/baselibc/README.md b/libs/baselibc/README.md
new file mode 100644
index 0000000..f7e9e49
--- /dev/null
+++ b/libs/baselibc/README.md
@@ -0,0 +1,6 @@
+Baselibc
+========
+This is a very simple libc for embedded systems. Mainly geared for 32-bit microcontrollers in the 10-100kB memory range.
+The library compiles to less than 5kB total on Cortex-M3, and much less if some functions aren't used.
+
+The code is based on klibc and tinyprintf modules, and licensed under the BSD license.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/egg.yml
----------------------------------------------------------------------
diff --git a/libs/baselibc/egg.yml b/libs/baselibc/egg.yml
new file mode 100644
index 0000000..fc8063c
--- /dev/null
+++ b/libs/baselibc/egg.yml
@@ -0,0 +1,6 @@
+egg.name: libs/baselibc
+egg.vers: 0.1
+egg.req_caps:
+ - console
+egg.identities:
+ - LIBC
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/assert.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/assert.h b/libs/baselibc/include/assert.h
new file mode 100644
index 0000000..6177190
--- /dev/null
+++ b/libs/baselibc/include/assert.h
@@ -0,0 +1,26 @@
+/*
+ * assert.h
+ */
+
+#ifndef _ASSERT_H
+#define _ASSERT_H
+
+#ifdef NDEBUG
+
+/*
+ * NDEBUG doesn't just suppress the faulting behavior of assert(),
+ * but also all side effects of the assert() argument. This behavior
+ * is required by the C standard, and allows the argument to reference
+ * variables that are not defined without NDEBUG.
+ */
+#define assert(x) ((void)(0))
+
+#else
+
+extern void __assert_func(const char *, unsigned int, const char *, const char *);
+
+#define assert(x) ((x) ? (void)0 : __assert_func(__FILE__, __LINE__, NULL, NULL))
+
+#endif
+
+#endif /* _ASSERT_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/ctype.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/ctype.h b/libs/baselibc/include/ctype.h
new file mode 100644
index 0000000..4670b6a
--- /dev/null
+++ b/libs/baselibc/include/ctype.h
@@ -0,0 +1,86 @@
+/*
+ * ctype.h
+ *
+ * This assumes ASCII.
+ */
+
+#ifndef _CTYPE_H
+#define _CTYPE_H
+
+#include <klibc/extern.h>
+#include <klibc/inline.h>
+
+__extern_inline int isupper(int __c)
+{
+ return __c >= 'A' && __c <= 'Z';
+}
+
+__extern_inline int islower(int __c)
+{
+ return __c >= 'a' && __c <= 'z';
+}
+
+__extern_inline int isalpha(int __c)
+{
+ return islower(__c) || isupper(__c);
+}
+
+__extern_inline int isdigit(int __c)
+{
+ return ((unsigned)__c - '0') <= 9;
+}
+
+__extern_inline int isalnum(int __c)
+{
+ return isalpha(__c) || isdigit(__c);
+}
+
+__extern_inline int isascii(int __c)
+{
+ return !(__c & ~0x7f);
+}
+
+__extern_inline int isblank(int __c)
+{
+ return (__c == '\t') || (__c == ' ');
+}
+
+__extern_inline int iscntrl(int __c)
+{
+ return __c < 0x20;
+}
+
+__extern_inline int isspace(int __c)
+{
+ return __c == ' ' || __c == '\n' || __c == '\t' || __c == '\r';
+}
+
+__extern_inline int isxdigit(int __c)
+{
+ return isdigit(__c) || (__c >= 'a' && __c <= 'f') || (__c >= 'A' && __c <= 'F');
+}
+
+__extern_inline int ispunct(int __c)
+{
+ return (__c >= '!' && __c <= '/') ||
+ (__c >= ':' && __c <= '@') ||
+ (__c >= '[' && __c <= '`') ||
+ (__c >= '{' && __c <= '~');
+}
+
+__extern_inline int isprint(int __c)
+{
+ return (__c >= 0x20 && __c <= 0x7e);
+}
+
+__extern_inline int toupper(int __c)
+{
+ return islower(__c) ? (__c & ~32) : __c;
+}
+
+__extern_inline int tolower(int __c)
+{
+ return isupper(__c) ? (__c | 32) : __c;
+}
+
+#endif /* _CTYPE_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/inttypes.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/inttypes.h b/libs/baselibc/include/inttypes.h
new file mode 100644
index 0000000..29311fe
--- /dev/null
+++ b/libs/baselibc/include/inttypes.h
@@ -0,0 +1,226 @@
+/*
+ * inttypes.h
+ */
+
+#ifndef _INTTYPES_H
+#define _INTTYPES_H
+
+#include <klibc/extern.h>
+#include <stdint.h>
+#include <stddef.h>
+
+static __inline__ intmax_t imaxabs(intmax_t __n)
+{
+ return (__n < (intmax_t) 0) ? -__n : __n;
+}
+
+__extern intmax_t strtoimax(const char *, char **, int);
+__extern uintmax_t strtoumax(const char *, char **, int);
+
+/* extensions */
+__extern intmax_t strntoimax(const char *, char **, int, size_t);
+__extern uintmax_t strntoumax(const char *, char **, int, size_t);
+
+#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
+
+#define PRId8 "d"
+#define PRId16 "d"
+#define PRId32 "d"
+#define PRId64 __PRI64_RANK "d"
+
+#define PRIdLEAST8 "d"
+#define PRIdLEAST16 "d"
+#define PRIdLEAST32 "d"
+#define PRIdLEAST64 __PRI64_RANK "d"
+
+#define PRIdFAST8 "d"
+#define PRIdFAST16 __PRIFAST_RANK "d"
+#define PRIdFAST32 __PRIFAST_RANK "d"
+#define PRIdFAST64 __PRI64_RANK "d"
+
+#define PRIdMAX __PRI64_RANK "d"
+#define PRIdPTR __PRIPTR_RANK "d"
+
+#define PRIi8 "i"
+#define PRIi16 "i"
+#define PRIi32 "i"
+#define PRIi64 __PRI64_RANK "i"
+
+#define PRIiLEAST8 "i"
+#define PRIiLEAST16 "i"
+#define PRIiLEAST32 "i"
+#define PRIiLEAST64 __PRI64_RANK "i"
+
+#define PRIiFAST8 "i"
+#define PRIiFAST16 __PRIFAST_RANK "i"
+#define PRIiFAST32 __PRIFAST_RANK "i"
+#define PRIiFAST64 __PRI64_RANK "i"
+
+#define PRIiMAX __PRI64_RANK "i"
+#define PRIiPTR __PRIPTR_RANK "i"
+
+#define PRIo8 "o"
+#define PRIo16 "o"
+#define PRIo32 "o"
+#define PRIo64 __PRI64_RANK "o"
+
+#define PRIoLEAST8 "o"
+#define PRIoLEAST16 "o"
+#define PRIoLEAST32 "o"
+#define PRIoLEAST64 __PRI64_RANK "o"
+
+#define PRIoFAST8 "o"
+#define PRIoFAST16 __PRIFAST_RANK "o"
+#define PRIoFAST32 __PRIFAST_RANK "o"
+#define PRIoFAST64 __PRI64_RANK "o"
+
+#define PRIoMAX __PRI64_RANK "o"
+#define PRIoPTR __PRIPTR_RANK "o"
+
+#define PRIu8 "u"
+#define PRIu16 "u"
+#define PRIu32 "u"
+#define PRIu64 __PRI64_RANK "u"
+
+#define PRIuLEAST8 "u"
+#define PRIuLEAST16 "u"
+#define PRIuLEAST32 "u"
+#define PRIuLEAST64 __PRI64_RANK "u"
+
+#define PRIuFAST8 "u"
+#define PRIuFAST16 __PRIFAST_RANK "u"
+#define PRIuFAST32 __PRIFAST_RANK "u"
+#define PRIuFAST64 __PRI64_RANK "u"
+
+#define PRIuMAX __PRI64_RANK "u"
+#define PRIuPTR __PRIPTR_RANK "u"
+
+#define PRIx8 "x"
+#define PRIx16 "x"
+#define PRIx32 "x"
+#define PRIx64 __PRI64_RANK "x"
+
+#define PRIxLEAST8 "x"
+#define PRIxLEAST16 "x"
+#define PRIxLEAST32 "x"
+#define PRIxLEAST64 __PRI64_RANK "x"
+
+#define PRIxFAST8 "x"
+#define PRIxFAST16 __PRIFAST_RANK "x"
+#define PRIxFAST32 __PRIFAST_RANK "x"
+#define PRIxFAST64 __PRI64_RANK "x"
+
+#define PRIxMAX __PRI64_RANK "x"
+#define PRIxPTR __PRIPTR_RANK "x"
+
+#define PRIX8 "X"
+#define PRIX16 "X"
+#define PRIX32 "X"
+#define PRIX64 __PRI64_RANK "X"
+
+#define PRIXLEAST8 "X"
+#define PRIXLEAST16 "X"
+#define PRIXLEAST32 "X"
+#define PRIXLEAST64 __PRI64_RANK "X"
+
+#define PRIXFAST8 "X"
+#define PRIXFAST16 __PRIFAST_RANK "X"
+#define PRIXFAST32 __PRIFAST_RANK "X"
+#define PRIXFAST64 __PRI64_RANK "X"
+
+#define PRIXMAX __PRI64_RANK "X"
+#define PRIXPTR __PRIPTR_RANK "X"
+
+#define SCNd8 "hhd"
+#define SCNd16 "hd"
+#define SCNd32 "d"
+#define SCNd64 __PRI64_RANK "d"
+
+#define SCNdLEAST8 "hhd"
+#define SCNdLEAST16 "hd"
+#define SCNdLEAST32 "d"
+#define SCNdLEAST64 __PRI64_RANK "d"
+
+#define SCNdFAST8 "hhd"
+#define SCNdFAST16 __PRIFAST_RANK "d"
+#define SCNdFAST32 __PRIFAST_RANK "d"
+#define SCNdFAST64 __PRI64_RANK "d"
+
+#define SCNdMAX __PRI64_RANK "d"
+#define SCNdPTR __PRIPTR_RANK "d"
+
+#define SCNi8 "hhi"
+#define SCNi16 "hi"
+#define SCNi32 "i"
+#define SCNi64 __PRI64_RANK "i"
+
+#define SCNiLEAST8 "hhi"
+#define SCNiLEAST16 "hi"
+#define SCNiLEAST32 "i"
+#define SCNiLEAST64 __PRI64_RANK "i"
+
+#define SCNiFAST8 "hhi"
+#define SCNiFAST16 __PRIFAST_RANK "i"
+#define SCNiFAST32 __PRIFAST_RANK "i"
+#define SCNiFAST64 __PRI64_RANK "i"
+
+#define SCNiMAX __PRI64_RANK "i"
+#define SCNiPTR __PRIPTR_RANK "i"
+
+#define SCNo8 "hho"
+#define SCNo16 "ho"
+#define SCNo32 "o"
+#define SCNo64 __PRI64_RANK "o"
+
+#define SCNoLEAST8 "hho"
+#define SCNoLEAST16 "ho"
+#define SCNoLEAST32 "o"
+#define SCNoLEAST64 __PRI64_RANK "o"
+
+#define SCNoFAST8 "hho"
+#define SCNoFAST16 __PRIFAST_RANK "o"
+#define SCNoFAST32 __PRIFAST_RANK "o"
+#define SCNoFAST64 __PRI64_RANK "o"
+
+#define SCNoMAX __PRI64_RANK "o"
+#define SCNoPTR __PRIPTR_RANK "o"
+
+#define SCNu8 "hhu"
+#define SCNu16 "hu"
+#define SCNu32 "u"
+#define SCNu64 __PRI64_RANK "u"
+
+#define SCNuLEAST8 "hhu"
+#define SCNuLEAST16 "hu"
+#define SCNuLEAST32 "u"
+#define SCNuLEAST64 __PRI64_RANK "u"
+
+#define SCNuFAST8 "hhu"
+#define SCNuFAST16 __PRIFAST_RANK "u"
+#define SCNuFAST32 __PRIFAST_RANK "u"
+#define SCNuFAST64 __PRI64_RANK "u"
+
+#define SCNuMAX __PRI64_RANK "u"
+#define SCNuPTR __PRIPTR_RANK "u"
+
+#define SCNx8 "hhx"
+#define SCNx16 "hx"
+#define SCNx32 "x"
+#define SCNx64 __PRI64_RANK "x"
+
+#define SCNxLEAST8 "hhx"
+#define SCNxLEAST16 "hx"
+#define SCNxLEAST32 "x"
+#define SCNxLEAST64 __PRI64_RANK "x"
+
+#define SCNxFAST8 "hhx"
+#define SCNxFAST16 __PRIFAST_RANK "x"
+#define SCNxFAST32 __PRIFAST_RANK "x"
+#define SCNxFAST64 __PRI64_RANK "x"
+
+#define SCNxMAX __PRI64_RANK "x"
+#define SCNxPTR __PRIPTR_RANK "x"
+
+#endif
+
+#endif /* _INTTYPES_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/klibc/extern.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/klibc/extern.h b/libs/baselibc/include/klibc/extern.h
new file mode 100644
index 0000000..7d7c7b8
--- /dev/null
+++ b/libs/baselibc/include/klibc/extern.h
@@ -0,0 +1,16 @@
+/*
+ * klibc/extern.h
+ */
+
+#ifndef _KLIBC_EXTERN_H
+#define _KLIBC_EXTERN_H
+
+#ifdef __cplusplus
+#define __extern extern "C"
+#else
+#define __extern extern
+#endif
+
+#define __alias(x) __attribute__((weak, alias(x)))
+
+#endif /* _KLIBC_EXTERN_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/klibc/inline.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/klibc/inline.h b/libs/baselibc/include/klibc/inline.h
new file mode 100644
index 0000000..0e54743
--- /dev/null
+++ b/libs/baselibc/include/klibc/inline.h
@@ -0,0 +1,12 @@
+/*
+ * klibc/inline.h
+ */
+
+#ifndef _KLIBC_INLINE_H
+#define _KLIBC_INLINE_H
+
+#ifndef __extern_inline
+#define __extern_inline extern inline __attribute__((gnu_inline))
+#endif
+
+#endif /* _KLIBC_INLINE_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/stdio.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/stdio.h b/libs/baselibc/include/stdio.h
new file mode 100644
index 0000000..3f93340
--- /dev/null
+++ b/libs/baselibc/include/stdio.h
@@ -0,0 +1,124 @@
+/*
+ * stdio.h
+ */
+
+#ifndef _STDIO_H
+#define _STDIO_H
+
+#include <klibc/extern.h>
+#include <klibc/inline.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+
+/* The File structure is designed to be compatible with ChibiOS/RT type
+ * BaseSequentialStream.
+ */
+struct File;
+
+typedef struct File FILE;
+
+struct File_methods
+{
+ size_t (*write)(FILE* instance, const char *bp, size_t n);
+ size_t (*read)(FILE* instance, char *bp, size_t n);
+};
+
+struct File
+{
+ const struct File_methods *vmt;
+};
+
+#ifndef EOF
+# define EOF (-1)
+#endif
+
+#ifndef BUFSIZ
+# define BUFSIZ 1
+#endif
+
+/* Standard file descriptors - implement these globals yourself. */
+extern FILE* const stdin;
+extern FILE* const stdout;
+extern FILE* const stderr;
+
+/* Wrappers around stream write and read */
+__extern_inline size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream)
+{
+ if (stream->vmt->read == NULL) return 0;
+ return stream->vmt->read(stream, buf, size*nmemb) / size;
+}
+
+__extern_inline size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream)
+{
+ if (stream->vmt->write == NULL) return 0;
+ return stream->vmt->write(stream, buf, size*nmemb) / size;
+}
+
+__extern_inline int fputs(const char *s, FILE *f)
+{
+ return fwrite(s, 1, strlen(s), f);
+}
+
+__extern_inline int puts(const char *s)
+{
+ return fwrite(s, 1, strlen(s), stdout) + fwrite("\n", 1, 1, stdout);
+}
+
+__extern_inline int fputc(int c, FILE *f)
+{
+ unsigned char ch = c;
+ return fwrite(&ch, 1, 1, f) == 1 ? ch : EOF;
+}
+
+__extern char *fgets(char *, int, FILE *);
+__extern_inline int fgetc(FILE *f)
+{
+ unsigned char ch;
+ return fread(&ch, 1, 1, f) == 1 ? ch : EOF;
+}
+
+__extern int errno;
+__extern_inline char *strerror(int errnum)
+{
+ return "error_str";
+}
+
+#define putc(c,f) fputc((c),(f))
+#define putchar(c) fputc((c),stdout)
+#define getc(f) fgetc(f)
+#define getchar() fgetc(stdin)
+
+__extern_inline int fflush(FILE *stream)
+{
+ return 0;
+}
+
+__extern int printf(const char *, ...);
+__extern int vprintf(const char *, va_list);
+__extern int fprintf(FILE *, const char *, ...);
+__extern int vfprintf(FILE *, const char *, va_list);
+__extern int sprintf(char *, const char *, ...);
+__extern int vsprintf(char *, const char *, va_list);
+__extern int snprintf(char *, size_t n, const char *, ...);
+__extern int vsnprintf(char *, size_t n, const char *, va_list);
+__extern int asprintf(char **, const char *, ...);
+__extern int vasprintf(char **, const char *, va_list);
+
+__extern int sscanf(const char *, const char *, ...);
+__extern int vsscanf(const char *, const char *, va_list);
+
+/* Open a memory buffer for writing.
+ Note: Does not write null terminator.*/
+struct MemFile
+{
+ struct File file;
+ char *buffer;
+ size_t bytes_written;
+ size_t size;
+};
+
+FILE *fmemopen_w(struct MemFile* storage, char *buffer, size_t size);
+
+
+#endif /* _STDIO_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/stdlib.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/stdlib.h b/libs/baselibc/include/stdlib.h
new file mode 100644
index 0000000..41a3dcf
--- /dev/null
+++ b/libs/baselibc/include/stdlib.h
@@ -0,0 +1,98 @@
+/*
+ * stdlib.h
+ */
+
+#ifndef _STDLIB_H
+#define _STDLIB_H
+
+#include <klibc/extern.h>
+#include <klibc/inline.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+__extern_inline int abs(int __n)
+{
+ return (__n < 0) ? -__n : __n;
+}
+
+__extern int atoi(const char *);
+__extern long atol(const char *);
+__extern long long atoll(const char *);
+
+__extern_inline long labs(long __n)
+{
+ return (__n < 0L) ? -__n : __n;
+}
+
+__extern_inline long long llabs(long long __n)
+{
+ return (__n < 0LL) ? -__n : __n;
+}
+
+__extern void free(void *);
+__extern void *malloc(size_t);
+__extern void *calloc(size_t, size_t);
+__extern void *realloc(void *, size_t);
+
+/* Giving malloc some memory from which to allocate */
+__extern void add_malloc_block(void *, size_t);
+__extern void get_malloc_memory_status(size_t *, size_t *);
+
+/* Malloc locking
+ * Until the callbacks are set, malloc doesn't do any locking.
+ * malloc_lock() *may* timeout, in which case malloc() will return NULL.
+ */
+typedef bool (*malloc_lock_t)();
+typedef void (*malloc_unlock_t)();
+__extern void set_malloc_locking(malloc_lock_t, malloc_unlock_t);
+
+__extern long strtol(const char *, char **, int);
+__extern long long strtoll(const char *, char **, int);
+__extern unsigned long strtoul(const char *, char **, int);
+__extern unsigned long long strtoull(const char *, char **, int);
+
+typedef int (*__comparefunc_t) (const void *, const void *);
+__extern void *bsearch(const void *, const void *, size_t, size_t,
+ __comparefunc_t);
+__extern void qsort(void *, size_t, size_t, __comparefunc_t);
+
+__extern long jrand48(unsigned short *);
+__extern long mrand48(void);
+__extern long nrand48(unsigned short *);
+__extern long lrand48(void);
+__extern unsigned short *seed48(const unsigned short *);
+__extern void srand48(long);
+
+__extern_inline char *getenv(const char *name)
+{
+ return NULL;
+}
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+__extern_inline void exit(int err)
+{
+ __extern void _exit(int s);
+
+ _exit(err);
+}
+
+#define RAND_MAX 0x7fffffff
+__extern_inline int rand(void)
+{
+ return (int)lrand48();
+}
+__extern_inline void srand(unsigned int __s)
+{
+ srand48(__s);
+}
+__extern_inline long random(void)
+{
+ return lrand48();
+}
+__extern_inline void srandom(unsigned int __s)
+{
+ srand48(__s);
+}
+
+#endif /* _STDLIB_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/include/string.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/include/string.h b/libs/baselibc/include/string.h
new file mode 100644
index 0000000..b3c1988
--- /dev/null
+++ b/libs/baselibc/include/string.h
@@ -0,0 +1,59 @@
+/*
+ * string.h
+ */
+
+#ifndef _STRING_H
+#define _STRING_H
+
+#include <klibc/extern.h>
+#include <stddef.h>
+
+__extern void *memccpy(void *, const void *, int, size_t);
+__extern void *memchr(const void *, int, size_t);
+__extern void *memrchr(const void *, int, size_t);
+__extern int memcmp(const void *, const void *, size_t);
+__extern void *memcpy(void *, const void *, size_t);
+__extern void *memmove(void *, const void *, size_t);
+__extern void *memset(void *, int, size_t);
+__extern void *memmem(const void *, size_t, const void *, size_t);
+__extern void memswap(void *, void *, size_t);
+__extern void bzero(void *, size_t);
+__extern int strcasecmp(const char *, const char *);
+__extern int strncasecmp(const char *, const char *, size_t);
+__extern char *strcat(char *, const char *);
+__extern char *strchr(const char *, int);
+__extern char *index(const char *, int);
+__extern char *strrchr(const char *, int);
+__extern char *rindex(const char *, int);
+__extern int strcmp(const char *, const char *);
+__extern char *strcpy(char *, const char *);
+__extern size_t strcspn(const char *, const char *);
+__extern char *strdup(const char *);
+__extern char *strndup(const char *, size_t);
+__extern size_t strlen(const char *);
+__extern size_t strnlen(const char *, size_t);
+__extern char *strncat(char *, const char *, size_t);
+__extern size_t strlcat(char *, const char *, size_t);
+__extern int strncmp(const char *, const char *, size_t);
+__extern char *strncpy(char *, const char *, size_t);
+__extern size_t strlcpy(char *, const char *, size_t);
+__extern char *strpbrk(const char *, const char *);
+__extern char *strsep(char **, const char *);
+__extern size_t strspn(const char *, const char *);
+__extern char *strstr(const char *, const char *);
+__extern char *strtok(char *, const char *);
+__extern char *strtok_r(char *, const char *, char **);
+
+/* Some dummy functions to avoid errors with C++ cstring */
+inline static int strcoll(const char *s1, const char *s2)
+{
+ return strcmp(s1, s2);
+}
+
+inline static size_t strxfrm(char *dest, const char *src, size_t n)
+{
+ strncpy(dest, src, n);
+ return strlen(src);
+}
+
+#endif /* _STRING_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/asprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/asprintf.c b/libs/baselibc/src/asprintf.c
new file mode 100644
index 0000000..a3f5f00
--- /dev/null
+++ b/libs/baselibc/src/asprintf.c
@@ -0,0 +1,30 @@
+/*
+ * asprintf.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int asprintf(char **bufp, const char *format, ...)
+{
+ va_list ap, ap1;
+ int rv;
+ int bytes;
+ char *p;
+
+ va_start(ap, format);
+ va_copy(ap1, ap);
+
+ bytes = vsnprintf(NULL, 0, format, ap1) + 1;
+ va_end(ap1);
+
+ *bufp = p = malloc(bytes);
+ if (!p)
+ return -1;
+
+ rv = vsnprintf(p, bytes, format, ap);
+ va_end(ap);
+
+ return rv;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/atoi.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/atoi.c b/libs/baselibc/src/atoi.c
new file mode 100644
index 0000000..a26abee
--- /dev/null
+++ b/libs/baselibc/src/atoi.c
@@ -0,0 +1,3 @@
+#define TYPE int
+#define NAME atoi
+#include "templates/atox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/atol.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/atol.c b/libs/baselibc/src/atol.c
new file mode 100644
index 0000000..1139c52
--- /dev/null
+++ b/libs/baselibc/src/atol.c
@@ -0,0 +1,3 @@
+#define TYPE long
+#define NAME atol
+#include "templates/atox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/atoll.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/atoll.c b/libs/baselibc/src/atoll.c
new file mode 100644
index 0000000..bc8a9fc
--- /dev/null
+++ b/libs/baselibc/src/atoll.c
@@ -0,0 +1,3 @@
+#define TYPE long long
+#define NAME atoll
+#include "templates/atox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/bsearch.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/bsearch.c b/libs/baselibc/src/bsearch.c
new file mode 100644
index 0000000..1c8b07f
--- /dev/null
+++ b/libs/baselibc/src/bsearch.c
@@ -0,0 +1,26 @@
+/*
+ * bsearch.c
+ */
+
+#include <stdlib.h>
+
+void *bsearch(const void *key, const void *base, size_t nmemb,
+ size_t size, int (*cmp) (const void *, const void *))
+{
+ while (nmemb) {
+ size_t mididx = nmemb / 2;
+ const void *midobj = base + mididx * size;
+ int diff = cmp(key, midobj);
+
+ if (diff == 0)
+ return (void *)midobj;
+
+ if (diff > 0) {
+ base = midobj + size;
+ nmemb -= mididx + 1;
+ } else
+ nmemb = mididx;
+ }
+
+ return NULL;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/bzero.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/bzero.c b/libs/baselibc/src/bzero.c
new file mode 100644
index 0000000..aa1c1ff
--- /dev/null
+++ b/libs/baselibc/src/bzero.c
@@ -0,0 +1,6 @@
+#include <string.h>
+
+void bzero(void *dst, size_t n)
+{
+ memset(dst, 0, n);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/calloc.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/calloc.c b/libs/baselibc/src/calloc.c
new file mode 100644
index 0000000..3db7664
--- /dev/null
+++ b/libs/baselibc/src/calloc.c
@@ -0,0 +1,20 @@
+/*
+ * calloc.c
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+/* FIXME: This should look for multiplication overflow */
+
+void *calloc(size_t nmemb, size_t size)
+{
+ void *ptr;
+
+ size *= nmemb;
+ ptr = malloc(size);
+ if (ptr)
+ memset(ptr, 0, size);
+
+ return ptr;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/fgets.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/fgets.c b/libs/baselibc/src/fgets.c
new file mode 100644
index 0000000..4e9cf68
--- /dev/null
+++ b/libs/baselibc/src/fgets.c
@@ -0,0 +1,31 @@
+/*
+ * fgets.c
+ *
+ * This will be very slow due to the implementation of getc(),
+ * but we don't have anywhere to put characters we don't need from
+ * the input.
+ */
+
+#include <stdio.h>
+
+char *fgets(char *s, int n, FILE *f)
+{
+ int ch;
+ char *p = s;
+
+ while (n > 1) {
+ ch = getc(f);
+ if (ch == EOF) {
+ *p = '\0';
+ return NULL;
+ }
+ *p++ = ch;
+ n--;
+ if (ch == '\n')
+ break;
+ }
+ if (n)
+ *p = '\0';
+
+ return s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/inline.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/inline.c b/libs/baselibc/src/inline.c
new file mode 100644
index 0000000..2d8d013
--- /dev/null
+++ b/libs/baselibc/src/inline.c
@@ -0,0 +1,5 @@
+// Make an externally visible symbol out of inlined functions
+#define __extern_inline
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/jrand48.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/jrand48.c b/libs/baselibc/src/jrand48.c
new file mode 100644
index 0000000..8e2b3ac
--- /dev/null
+++ b/libs/baselibc/src/jrand48.c
@@ -0,0 +1,24 @@
+/*
+ * jrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+long jrand48(unsigned short xsubi[3])
+{
+ uint64_t x;
+
+ /* The xsubi[] array is littleendian by spec */
+ x = (uint64_t) (uint16_t) xsubi[0] +
+ ((uint64_t) (uint16_t) xsubi[1] << 16) +
+ ((uint64_t) (uint16_t) xsubi[2] << 32);
+
+ x = (0x5deece66dULL * x) + 0xb;
+
+ xsubi[0] = (unsigned short)(uint16_t) x;
+ xsubi[1] = (unsigned short)(uint16_t) (x >> 16);
+ xsubi[2] = (unsigned short)(uint16_t) (x >> 32);
+
+ return (long)(int32_t) (x >> 16);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/lrand48.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/lrand48.c b/libs/baselibc/src/lrand48.c
new file mode 100644
index 0000000..a2fc87a
--- /dev/null
+++ b/libs/baselibc/src/lrand48.c
@@ -0,0 +1,13 @@
+/*
+ * lrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3]; /* Common with mrand48.c, srand48.c */
+
+long lrand48(void)
+{
+ return (uint32_t) jrand48(__rand48_seed) >> 1;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/malloc.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/malloc.c b/libs/baselibc/src/malloc.c
new file mode 100644
index 0000000..1d56de4
--- /dev/null
+++ b/libs/baselibc/src/malloc.c
@@ -0,0 +1,274 @@
+/*
+ * malloc.c
+ *
+ * Very simple linked-list based malloc()/free().
+ */
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "malloc.h"
+
+/* Both the arena list and the free memory list are double linked
+ list with head node. This the head node. Note that the arena list
+ is sorted in order of address. */
+static struct free_arena_header __malloc_head = {
+ {
+ ARENA_TYPE_HEAD,
+ 0,
+ &__malloc_head,
+ &__malloc_head,
+ },
+ &__malloc_head,
+ &__malloc_head
+};
+
+static bool malloc_lock_nop() {return true;}
+static void malloc_unlock_nop() {}
+
+static malloc_lock_t malloc_lock = &malloc_lock_nop;
+static malloc_unlock_t malloc_unlock = &malloc_unlock_nop;
+
+static inline void mark_block_dead(struct free_arena_header *ah)
+{
+#ifdef DEBUG_MALLOC
+ ah->a.type = ARENA_TYPE_DEAD;
+#endif
+}
+
+static inline void remove_from_main_chain(struct free_arena_header *ah)
+{
+ struct free_arena_header *ap, *an;
+
+ mark_block_dead(ah);
+
+ ap = ah->a.prev;
+ an = ah->a.next;
+ ap->a.next = an;
+ an->a.prev = ap;
+}
+
+static inline void remove_from_free_chain(struct free_arena_header *ah)
+{
+ struct free_arena_header *ap, *an;
+
+ ap = ah->prev_free;
+ an = ah->next_free;
+ ap->next_free = an;
+ an->prev_free = ap;
+}
+
+static inline void remove_from_chains(struct free_arena_header *ah)
+{
+ remove_from_free_chain(ah);
+ remove_from_main_chain(ah);
+}
+
+static void *__malloc_from_block(struct free_arena_header *fp, size_t size)
+{
+ size_t fsize;
+ struct free_arena_header *nfp, *na, *fpn, *fpp;
+
+ fsize = fp->a.size;
+
+ /* We need the 2* to account for the larger requirements of a
+ free block */
+ if (fsize >= size + 2 * sizeof(struct arena_header)) {
+ /* Bigger block than required -- split block */
+ nfp = (struct free_arena_header *)((char *)fp + size);
+ na = fp->a.next;
+
+ nfp->a.type = ARENA_TYPE_FREE;
+ nfp->a.size = fsize - size;
+ fp->a.type = ARENA_TYPE_USED;
+ fp->a.size = size;
+
+ /* Insert into all-block chain */
+ nfp->a.prev = fp;
+ nfp->a.next = na;
+ na->a.prev = nfp;
+ fp->a.next = nfp;
+
+ /* Replace current block on free chain */
+ nfp->next_free = fpn = fp->next_free;
+ nfp->prev_free = fpp = fp->prev_free;
+ fpn->prev_free = nfp;
+ fpp->next_free = nfp;
+ } else {
+ fp->a.type = ARENA_TYPE_USED; /* Allocate the whole block */
+ remove_from_free_chain(fp);
+ }
+
+ return (void *)(&fp->a + 1);
+}
+
+static struct free_arena_header *__free_block(struct free_arena_header *ah)
+{
+ struct free_arena_header *pah, *nah;
+
+ pah = ah->a.prev;
+ nah = ah->a.next;
+ if (pah->a.type == ARENA_TYPE_FREE &&
+ (char *)pah + pah->a.size == (char *)ah) {
+ /* Coalesce into the previous block */
+ pah->a.size += ah->a.size;
+ pah->a.next = nah;
+ nah->a.prev = pah;
+ mark_block_dead(ah);
+
+ ah = pah;
+ pah = ah->a.prev;
+ } else {
+ /* Need to add this block to the free chain */
+ ah->a.type = ARENA_TYPE_FREE;
+
+ ah->next_free = __malloc_head.next_free;
+ ah->prev_free = &__malloc_head;
+ __malloc_head.next_free = ah;
+ ah->next_free->prev_free = ah;
+ }
+
+ /* In either of the previous cases, we might be able to merge
+ with the subsequent block... */
+ if (nah->a.type == ARENA_TYPE_FREE &&
+ (char *)ah + ah->a.size == (char *)nah) {
+ ah->a.size += nah->a.size;
+
+ /* Remove the old block from the chains */
+ remove_from_chains(nah);
+ }
+
+ /* Return the block that contains the called block */
+ return ah;
+}
+
+void *malloc(size_t size)
+{
+ struct free_arena_header *fp;
+ void *more_mem;
+ extern void *_sbrk(int incr);
+
+ if (size == 0)
+ return NULL;
+
+ /* Add the obligatory arena header, and round up */
+ size = (size + 2 * sizeof(struct arena_header) - 1) & ARENA_SIZE_MASK;
+
+ if (!malloc_lock())
+ return NULL;
+
+ void *result = NULL;
+retry_alloc:
+ for (fp = __malloc_head.next_free; fp->a.type != ARENA_TYPE_HEAD;
+ fp = fp->next_free) {
+ if (fp->a.size >= size) {
+ /* Found fit -- allocate out of this block */
+ result = __malloc_from_block(fp, size);
+ break;
+ }
+ }
+ if (result == NULL) {
+ more_mem = _sbrk(size);
+ if (more_mem) {
+ add_malloc_block(more_mem, size);
+ goto retry_alloc;
+ }
+ }
+ malloc_unlock();
+ return result;
+}
+
+/* Call this to give malloc some memory to allocate from */
+void add_malloc_block(void *buf, size_t size)
+{
+ struct free_arena_header *fp = buf;
+ struct free_arena_header *pah;
+
+ if (size < sizeof(struct free_arena_header))
+ return; // Too small.
+
+ /* Insert the block into the management chains. We need to set
+ up the size and the main block list pointer, the rest of
+ the work is logically identical to free(). */
+ fp->a.type = ARENA_TYPE_FREE;
+ fp->a.size = size;
+
+ if (!malloc_lock())
+ return;
+
+ /* We need to insert this into the main block list in the proper
+ place -- this list is required to be sorted. Since we most likely
+ get memory assignments in ascending order, search backwards for
+ the proper place. */
+ for (pah = __malloc_head.a.prev; pah->a.type != ARENA_TYPE_HEAD;
+ pah = pah->a.prev) {
+ if (pah < fp)
+ break;
+ }
+
+ /* Now pah points to the node that should be the predecessor of
+ the new node */
+ fp->a.next = pah->a.next;
+ fp->a.prev = pah;
+ pah->a.next = fp;
+ fp->a.next->a.prev = fp;
+
+ /* Insert into the free chain and coalesce with adjacent blocks */
+ fp = __free_block(fp);
+
+ malloc_unlock();
+}
+
+void free(void *ptr)
+{
+ struct free_arena_header *ah;
+
+ if (!ptr)
+ return;
+
+ ah = (struct free_arena_header *)
+ ((struct arena_header *)ptr - 1);
+
+#ifdef DEBUG_MALLOC
+ assert(ah->a.type == ARENA_TYPE_USED);
+#endif
+
+ if (!malloc_lock())
+ return;
+
+ /* Merge into adjacent free blocks */
+ ah = __free_block(ah);
+ malloc_unlock();
+}
+
+void get_malloc_memory_status(size_t *free_bytes, size_t *largest_block)
+{
+ struct free_arena_header *fp;
+ *free_bytes = 0;
+ *largest_block = 0;
+
+ if (!malloc_lock())
+ return;
+
+ for (fp = __malloc_head.next_free; fp->a.type != ARENA_TYPE_HEAD; fp = fp->next_free) {
+ *free_bytes += fp->a.size;
+ if (fp->a.size >= *largest_block) {
+ *largest_block = fp->a.size;
+ }
+ }
+
+ malloc_unlock();
+}
+
+void set_malloc_locking(malloc_lock_t lock, malloc_unlock_t unlock)
+{
+ if (lock)
+ malloc_lock = lock;
+ else
+ malloc_lock = &malloc_lock_nop;
+
+ if (unlock)
+ malloc_unlock = unlock;
+ else
+ malloc_unlock = &malloc_unlock_nop;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/malloc.h
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/malloc.h b/libs/baselibc/src/malloc.h
new file mode 100644
index 0000000..2bed2a6
--- /dev/null
+++ b/libs/baselibc/src/malloc.h
@@ -0,0 +1,43 @@
+/*
+ * malloc.h
+ *
+ * Internals for the memory allocator
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+
+/*
+ * This structure should be a power of two. This becomes the
+ * alignment unit.
+ */
+struct free_arena_header;
+
+struct arena_header {
+ size_t type;
+ size_t size;
+ struct free_arena_header *next, *prev;
+};
+
+#ifdef DEBUG_MALLOC
+#define ARENA_TYPE_USED 0x64e69c70
+#define ARENA_TYPE_FREE 0x012d610a
+#define ARENA_TYPE_HEAD 0x971676b5
+#define ARENA_TYPE_DEAD 0xeeeeeeee
+#else
+#define ARENA_TYPE_USED 0
+#define ARENA_TYPE_FREE 1
+#define ARENA_TYPE_HEAD 2
+#endif
+
+#define ARENA_SIZE_MASK (~(sizeof(struct arena_header)-1))
+
+/*
+ * This structure should be no more than twice the size of the
+ * previous structure.
+ */
+struct free_arena_header {
+ struct arena_header a;
+ struct free_arena_header *next_free, *prev_free;
+};
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memccpy.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memccpy.c b/libs/baselibc/src/memccpy.c
new file mode 100644
index 0000000..83d02c9
--- /dev/null
+++ b/libs/baselibc/src/memccpy.c
@@ -0,0 +1,23 @@
+/*
+ * memccpy.c
+ *
+ * memccpy()
+ */
+
+#include <stddef.h>
+#include <string.h>
+
+void *memccpy(void *dst, const void *src, int c, size_t n)
+{
+ char *q = dst;
+ const char *p = src;
+ char ch;
+
+ while (n--) {
+ *q++ = ch = *p++;
+ if (ch == (char)c)
+ return q;
+ }
+
+ return NULL; /* No instance of "c" found */
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memchr.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memchr.c b/libs/baselibc/src/memchr.c
new file mode 100644
index 0000000..f1947fb
--- /dev/null
+++ b/libs/baselibc/src/memchr.c
@@ -0,0 +1,19 @@
+/*
+ * memchr.c
+ */
+
+#include <stddef.h>
+#include <string.h>
+
+void *memchr(const void *s, int c, size_t n)
+{
+ const unsigned char *sp = s;
+
+ while (n--) {
+ if (*sp == (unsigned char)c)
+ return (void *)sp;
+ sp++;
+ }
+
+ return NULL;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memcmp.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memcmp.c b/libs/baselibc/src/memcmp.c
new file mode 100644
index 0000000..3ce9941
--- /dev/null
+++ b/libs/baselibc/src/memcmp.c
@@ -0,0 +1,19 @@
+/*
+ * memcmp.c
+ */
+
+#include <string.h>
+
+int memcmp(const void *s1, const void *s2, size_t n)
+{
+ const unsigned char *c1 = s1, *c2 = s2;
+ int d = 0;
+
+ while (n--) {
+ d = (int)*c1++ - (int)*c2++;
+ if (d)
+ break;
+ }
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memcpy.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memcpy.c b/libs/baselibc/src/memcpy.c
new file mode 100644
index 0000000..5ce206d
--- /dev/null
+++ b/libs/baselibc/src/memcpy.c
@@ -0,0 +1,29 @@
+/*
+ * memcpy.c
+ */
+
+#include <string.h>
+#include <stdint.h>
+
+void *memcpy(void *dst, const void *src, size_t n)
+{
+ const char *p = src;
+ char *q = dst;
+#if defined(__i386__)
+ size_t nl = n >> 2;
+ asm volatile ("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb":"+c" (nl),
+ "+S"(p), "+D"(q)
+ :"r"(n & 3));
+#elif defined(__x86_64__)
+ size_t nq = n >> 3;
+ asm volatile ("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb":"+c"
+ (nq), "+S"(p), "+D"(q)
+ :"r"((uint32_t) (n & 7)));
+#else
+ while (n--) {
+ *q++ = *p++;
+ }
+#endif
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memfile.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memfile.c b/libs/baselibc/src/memfile.c
new file mode 100644
index 0000000..c915004
--- /dev/null
+++ b/libs/baselibc/src/memfile.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+
+size_t memfile_write(FILE *instance, const char *bp, size_t n)
+{
+ struct MemFile *f = (struct MemFile*)instance;
+ size_t i = 0;
+
+ while (n--)
+ {
+ f->bytes_written++;
+ if (f->bytes_written <= f->size)
+ {
+ *f->buffer++ = *bp++;
+ i++;
+ }
+ }
+
+ return i;
+}
+
+const struct File_methods MemFile_methods = {
+ &memfile_write,
+ NULL
+};
+
+FILE *fmemopen_w(struct MemFile* storage, char *buffer, size_t size)
+{
+ storage->file.vmt = &MemFile_methods;
+ storage->buffer = buffer;
+ storage->bytes_written = 0;
+ storage->size = size;
+ return (FILE*)storage;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memmem.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memmem.c b/libs/baselibc/src/memmem.c
new file mode 100644
index 0000000..8b5faa0
--- /dev/null
+++ b/libs/baselibc/src/memmem.c
@@ -0,0 +1,52 @@
+/*
+ * memmem.c
+ *
+ * Find a byte string inside a longer byte string
+ *
+ * This uses the "Not So Naive" algorithm, a very simple but
+ * usually effective algorithm, see:
+ *
+ * http://www-igm.univ-mlv.fr/~lecroq/string/
+ */
+
+#include <string.h>
+
+void *memmem(const void *haystack, size_t n, const void *needle, size_t m)
+{
+ const unsigned char *y = (const unsigned char *)haystack;
+ const unsigned char *x = (const unsigned char *)needle;
+
+ size_t j, k, l;
+
+ if (m > n || !m || !n)
+ return NULL;
+
+ if (1 != m) {
+ if (x[0] == x[1]) {
+ k = 2;
+ l = 1;
+ } else {
+ k = 1;
+ l = 2;
+ }
+
+ j = 0;
+ while (j <= n - m) {
+ if (x[1] != y[j + 1]) {
+ j += k;
+ } else {
+ if (!memcmp(x + 2, y + j + 2, m - 2)
+ && x[0] == y[j])
+ return (void *)&y[j];
+ j += l;
+ }
+ }
+ } else
+ do {
+ if (*y == *x)
+ return (void *)y;
+ y++;
+ } while (--n);
+
+ return NULL;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memmove.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memmove.c b/libs/baselibc/src/memmove.c
new file mode 100644
index 0000000..a398cd8
--- /dev/null
+++ b/libs/baselibc/src/memmove.c
@@ -0,0 +1,36 @@
+/*
+ * memmove.c
+ */
+
+#include <string.h>
+
+void *memmove(void *dst, const void *src, size_t n)
+{
+ const char *p = src;
+ char *q = dst;
+#if defined(__i386__) || defined(__x86_64__)
+ if (q < p) {
+ asm volatile("cld; rep; movsb"
+ : "+c" (n), "+S"(p), "+D"(q));
+ } else {
+ p += (n - 1);
+ q += (n - 1);
+ asm volatile("std; rep; movsb; cld"
+ : "+c" (n), "+S"(p), "+D"(q));
+ }
+#else
+ if (q < p) {
+ while (n--) {
+ *q++ = *p++;
+ }
+ } else {
+ p += n;
+ q += n;
+ while (n--) {
+ *--q = *--p;
+ }
+ }
+#endif
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memrchr.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memrchr.c b/libs/baselibc/src/memrchr.c
new file mode 100644
index 0000000..ff6d711
--- /dev/null
+++ b/libs/baselibc/src/memrchr.c
@@ -0,0 +1,19 @@
+/*
+ * memrchr.c
+ */
+
+#include <stddef.h>
+#include <string.h>
+
+void *memrchr(const void *s, int c, size_t n)
+{
+ const unsigned char *sp = (const unsigned char *)s + n - 1;
+
+ while (n--) {
+ if (*sp == (unsigned char)c)
+ return (void *)sp;
+ sp--;
+ }
+
+ return NULL;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memset.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memset.c b/libs/baselibc/src/memset.c
new file mode 100644
index 0000000..aa00b5b
--- /dev/null
+++ b/libs/baselibc/src/memset.c
@@ -0,0 +1,30 @@
+/*
+ * memset.c
+ */
+
+#include <string.h>
+#include <stdint.h>
+
+void *memset(void *dst, int c, size_t n)
+{
+ char *q = dst;
+
+#if defined(__i386__)
+ size_t nl = n >> 2;
+ asm volatile ("cld ; rep ; stosl ; movl %3,%0 ; rep ; stosb"
+ : "+c" (nl), "+D" (q)
+ : "a" ((unsigned char)c * 0x01010101U), "r" (n & 3));
+#elif defined(__x86_64__)
+ size_t nq = n >> 3;
+ asm volatile ("cld ; rep ; stosq ; movl %3,%%ecx ; rep ; stosb"
+ :"+c" (nq), "+D" (q)
+ : "a" ((unsigned char)c * 0x0101010101010101U),
+ "r" ((uint32_t) n & 7));
+#else
+ while (n--) {
+ *q++ = c;
+ }
+#endif
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/memswap.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/memswap.c b/libs/baselibc/src/memswap.c
new file mode 100644
index 0000000..b32315c
--- /dev/null
+++ b/libs/baselibc/src/memswap.c
@@ -0,0 +1,24 @@
+/*
+ * memswap()
+ *
+ * Swaps the contents of two nonoverlapping memory areas.
+ * This really could be done faster...
+ */
+
+#include <string.h>
+
+void memswap(void *m1, void *m2, size_t n)
+{
+ char *p = m1;
+ char *q = m2;
+ char tmp;
+
+ while (n--) {
+ tmp = *p;
+ *p = *q;
+ *q = tmp;
+
+ p++;
+ q++;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/mrand48.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/mrand48.c b/libs/baselibc/src/mrand48.c
new file mode 100644
index 0000000..1a2383b
--- /dev/null
+++ b/libs/baselibc/src/mrand48.c
@@ -0,0 +1,13 @@
+/*
+ * mrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+extern unsigned short __rand48_seed[3]; /* Common with lrand48.c, srand48.c */
+
+long mrand48(void)
+{
+ return jrand48(__rand48_seed);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/mynewt.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/mynewt.c b/libs/baselibc/src/mynewt.c
new file mode 100644
index 0000000..dbe4eaf
--- /dev/null
+++ b/libs/baselibc/src/mynewt.c
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2015 Runtime Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <console/console.h>
+
+static size_t
+stdin_read(FILE *fp, char *bp, size_t n)
+{
+ return 0;
+}
+
+static size_t
+stdout_write(FILE *fp, const char *bp, size_t n)
+{
+ console_write(bp, n);
+ return n;
+}
+
+static struct File_methods _stdin_methods = {
+ .write = stdout_write,
+ .read = stdin_read
+};
+
+static struct File _stdin = {
+ .vmt = &_stdin_methods
+};
+
+struct File *const stdin = &_stdin;
+struct File *const stdout = &_stdin;
+struct File *const stderr = &_stdin;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/nrand48.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/nrand48.c b/libs/baselibc/src/nrand48.c
new file mode 100644
index 0000000..cb3532b
--- /dev/null
+++ b/libs/baselibc/src/nrand48.c
@@ -0,0 +1,11 @@
+/*
+ * nrand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+long nrand48(unsigned short xsubi[3])
+{
+ return (long)((uint32_t) jrand48(xsubi) >> 1);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/qsort.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/qsort.c b/libs/baselibc/src/qsort.c
new file mode 100644
index 0000000..4c189fc
--- /dev/null
+++ b/libs/baselibc/src/qsort.c
@@ -0,0 +1,46 @@
+/*
+ * qsort.c
+ *
+ * This is actually combsort. It's an O(n log n) algorithm with
+ * simplicity/small code size being its main virtue.
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+static inline size_t newgap(size_t gap)
+{
+ gap = (gap * 10) / 13;
+ if (gap == 9 || gap == 10)
+ gap = 11;
+
+ if (gap < 1)
+ gap = 1;
+ return gap;
+}
+
+void qsort(void *base, size_t nmemb, size_t size,
+ int (*compar) (const void *, const void *))
+{
+ size_t gap = nmemb;
+ size_t i, j;
+ char *p1, *p2;
+ int swapped;
+
+ if (!nmemb)
+ return;
+
+ do {
+ gap = newgap(gap);
+ swapped = 0;
+
+ for (i = 0, p1 = base; i < nmemb - gap; i++, p1 += size) {
+ j = i + gap;
+ if (compar(p1, p2 = (char *)base + j * size) > 0) {
+ memswap(p1, p2, size);
+ swapped = 1;
+ }
+ }
+ } while (gap > 1 || swapped);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/realloc.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/realloc.c b/libs/baselibc/src/realloc.c
new file mode 100644
index 0000000..14a2f2f
--- /dev/null
+++ b/libs/baselibc/src/realloc.c
@@ -0,0 +1,48 @@
+/*
+ * realloc.c
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "malloc.h"
+
+/* FIXME: This is cheesy, it should be fixed later */
+
+void *realloc(void *ptr, size_t size)
+{
+ struct free_arena_header *ah;
+ void *newptr;
+ size_t oldsize;
+
+ if (!ptr)
+ return malloc(size);
+
+ if (size == 0) {
+ free(ptr);
+ return NULL;
+ }
+
+ /* Add the obligatory arena header, and round up */
+ size = (size + 2 * sizeof(struct arena_header) - 1) & ARENA_SIZE_MASK;
+
+ ah = (struct free_arena_header *)
+ ((struct arena_header *)ptr - 1);
+
+ if (ah->a.size >= size && size >= (ah->a.size >> 2)) {
+ /* This field is a good size already. */
+ return ptr;
+ } else {
+ /* Make me a new block. This is kind of bogus; we should
+ be checking the following block to see if we can do an
+ in-place adjustment... fix that later. */
+
+ oldsize = ah->a.size - sizeof(struct arena_header);
+
+ newptr = malloc(size);
+ memcpy(newptr, ptr, (size < oldsize) ? size : oldsize);
+ free(ptr);
+
+ return newptr;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/sprintf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/sprintf.c b/libs/baselibc/src/sprintf.c
new file mode 100644
index 0000000..c6d8758
--- /dev/null
+++ b/libs/baselibc/src/sprintf.c
@@ -0,0 +1,18 @@
+/*
+ * sprintf.c
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+int sprintf(char *buffer, const char *format, ...)
+{
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vsnprintf(buffer, ~(size_t) 0, format, ap);
+ va_end(ap);
+
+ return rv;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/srand48.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/srand48.c b/libs/baselibc/src/srand48.c
new file mode 100644
index 0000000..e1c9567
--- /dev/null
+++ b/libs/baselibc/src/srand48.c
@@ -0,0 +1,15 @@
+/*
+ * srand48.c
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+unsigned short __rand48_seed[3]; /* Common with mrand48.c, lrand48.c */
+
+void srand48(long seedval)
+{
+ __rand48_seed[0] = 0x330e;
+ __rand48_seed[1] = (unsigned short)seedval;
+ __rand48_seed[2] = (unsigned short)((uint32_t) seedval >> 16);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/sscanf.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/sscanf.c b/libs/baselibc/src/sscanf.c
new file mode 100644
index 0000000..f53b276
--- /dev/null
+++ b/libs/baselibc/src/sscanf.c
@@ -0,0 +1,17 @@
+/*
+ * sscanf()
+ */
+
+#include <stdio.h>
+
+int sscanf(const char *str, const char *format, ...)
+{
+ va_list ap;
+ int rv;
+
+ va_start(ap, format);
+ rv = vsscanf(str, format, ap);
+ va_end(ap);
+
+ return rv;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strcasecmp.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strcasecmp.c b/libs/baselibc/src/strcasecmp.c
new file mode 100644
index 0000000..ee1f28b
--- /dev/null
+++ b/libs/baselibc/src/strcasecmp.c
@@ -0,0 +1,24 @@
+/*
+ * strcasecmp.c
+ */
+
+#include <string.h>
+#include <ctype.h>
+
+int strcasecmp(const char *s1, const char *s2)
+{
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
+ unsigned char ch;
+ int d = 0;
+
+ while (1) {
+ /* toupper() expects an unsigned char (implicitly cast to int)
+ as input, and returns an int, which is exactly what we want. */
+ d = toupper(ch = *c1++) - toupper(*c2++);
+ if (d || !ch)
+ break;
+ }
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strcat.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strcat.c b/libs/baselibc/src/strcat.c
new file mode 100644
index 0000000..6c5b673
--- /dev/null
+++ b/libs/baselibc/src/strcat.c
@@ -0,0 +1,11 @@
+/*
+ * strcat.c
+ */
+
+#include <string.h>
+
+char *strcat(char *dst, const char *src)
+{
+ strcpy(strchr(dst, '\0'), src);
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strchr.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strchr.c b/libs/baselibc/src/strchr.c
new file mode 100644
index 0000000..6a57313
--- /dev/null
+++ b/libs/baselibc/src/strchr.c
@@ -0,0 +1,17 @@
+/*
+ * strchr.c
+ */
+
+#include <string.h>
+
+char *strchr(const char *s, int c)
+{
+ while (*s != (char)c) {
+ if (!*s)
+ return NULL;
+ s++;
+ }
+
+ return (char *)s;
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strcmp.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strcmp.c b/libs/baselibc/src/strcmp.c
new file mode 100644
index 0000000..3ab9f5a
--- /dev/null
+++ b/libs/baselibc/src/strcmp.c
@@ -0,0 +1,21 @@
+/*
+ * strcmp.c
+ */
+
+#include <string.h>
+
+int strcmp(const char *s1, const char *s2)
+{
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
+ unsigned char ch;
+ int d = 0;
+
+ while (1) {
+ d = (int)(ch = *c1++) - (int)*c2++;
+ if (d || !ch)
+ break;
+ }
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strcpy.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strcpy.c b/libs/baselibc/src/strcpy.c
new file mode 100644
index 0000000..aa656cf
--- /dev/null
+++ b/libs/baselibc/src/strcpy.c
@@ -0,0 +1,20 @@
+/*
+ * strcpy.c
+ *
+ * strcpy()
+ */
+
+#include <string.h>
+
+char *strcpy(char *dst, const char *src)
+{
+ char *q = dst;
+ const char *p = src;
+ char ch;
+
+ do {
+ *q++ = ch = *p++;
+ } while (ch);
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strcspn.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strcspn.c b/libs/baselibc/src/strcspn.c
new file mode 100644
index 0000000..ba9e3be
--- /dev/null
+++ b/libs/baselibc/src/strcspn.c
@@ -0,0 +1,51 @@
+/*
+FUNCTION
+ <<strcspn>>---count characters not in string
+
+INDEX
+ strcspn
+
+ANSI_SYNOPSIS
+ size_t strcspn(const char *<[s1]>, const char *<[s2]>);
+
+TRAD_SYNOPSIS
+ size_t strcspn(<[s1]>, <[s2]>)
+ char *<[s1]>;
+ char *<[s2]>;
+
+DESCRIPTION
+ This function computes the length of the initial part of
+ the string pointed to by <[s1]> which consists entirely of
+ characters <[NOT]> from the string pointed to by <[s2]>
+ (excluding the terminating null character).
+
+RETURNS
+ <<strcspn>> returns the length of the substring found.
+
+PORTABILITY
+<<strcspn>> is ANSI C.
+
+<<strcspn>> requires no supporting OS subroutines.
+ */
+
+#include <string.h>
+
+size_t strcspn(const char *s1, const char *s2)
+{
+ const char *s = s1;
+ const char *c;
+
+ while (*s1)
+ {
+ for (c = s2; *c; c++)
+ {
+ if (*s1 == *c)
+ break;
+ }
+ if (*c)
+ break;
+ s1++;
+ }
+
+ return s1 - s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strdup.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strdup.c b/libs/baselibc/src/strdup.c
new file mode 100644
index 0000000..905b51d
--- /dev/null
+++ b/libs/baselibc/src/strdup.c
@@ -0,0 +1,17 @@
+/*
+ * strdup.c
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+char *strdup(const char *s)
+{
+ int l = strlen(s) + 1;
+ char *d = malloc(l);
+
+ if (d)
+ memcpy(d, s, l);
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strlcat.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strlcat.c b/libs/baselibc/src/strlcat.c
new file mode 100644
index 0000000..6d95087
--- /dev/null
+++ b/libs/baselibc/src/strlcat.c
@@ -0,0 +1,30 @@
+/*
+ * strlcat.c
+ */
+
+#include <string.h>
+
+size_t strlcat(char *dst, const char *src, size_t size)
+{
+ size_t bytes = 0;
+ char *q = dst;
+ const char *p = src;
+ char ch;
+
+ while (bytes < size && *q) {
+ q++;
+ bytes++;
+ }
+ if (bytes == size)
+ return (bytes + strlen(src));
+
+ while ((ch = *p++)) {
+ if (bytes + 1 < size)
+ *q++ = ch;
+
+ bytes++;
+ }
+
+ *q = '\0';
+ return bytes;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strlcpy.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strlcpy.c b/libs/baselibc/src/strlcpy.c
new file mode 100644
index 0000000..3ec8fd2
--- /dev/null
+++ b/libs/baselibc/src/strlcpy.c
@@ -0,0 +1,26 @@
+/*
+ * strlcpy.c
+ */
+
+#include <string.h>
+
+size_t strlcpy(char *dst, const char *src, size_t size)
+{
+ size_t bytes = 0;
+ char *q = dst;
+ const char *p = src;
+ char ch;
+
+ while ((ch = *p++)) {
+ if (bytes + 1 < size)
+ *q++ = ch;
+
+ bytes++;
+ }
+
+ /* If size == 0 there is no space for a final null... */
+ if (size)
+ *q = '\0';
+
+ return bytes;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strlen.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strlen.c b/libs/baselibc/src/strlen.c
new file mode 100644
index 0000000..86526a5
--- /dev/null
+++ b/libs/baselibc/src/strlen.c
@@ -0,0 +1,13 @@
+/*
+ * strlen()
+ */
+
+#include <string.h>
+
+size_t strlen(const char *s)
+{
+ const char *ss = s;
+ while (*ss)
+ ss++;
+ return ss - s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strncasecmp.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strncasecmp.c b/libs/baselibc/src/strncasecmp.c
new file mode 100644
index 0000000..0551935
--- /dev/null
+++ b/libs/baselibc/src/strncasecmp.c
@@ -0,0 +1,24 @@
+/*
+ * strncasecmp.c
+ */
+
+#include <string.h>
+#include <ctype.h>
+
+int strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
+ unsigned char ch;
+ int d = 0;
+
+ while (n--) {
+ /* toupper() expects an unsigned char (implicitly cast to int)
+ as input, and returns an int, which is exactly what we want. */
+ d = toupper(ch = *c1++) - toupper(*c2++);
+ if (d || !ch)
+ break;
+ }
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strncat.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strncat.c b/libs/baselibc/src/strncat.c
new file mode 100644
index 0000000..5b86216
--- /dev/null
+++ b/libs/baselibc/src/strncat.c
@@ -0,0 +1,21 @@
+/*
+ * strncat.c
+ */
+
+#include <string.h>
+
+char *strncat(char *dst, const char *src, size_t n)
+{
+ char *q = strchr(dst, '\0');
+ const char *p = src;
+ char ch;
+
+ while (n--) {
+ *q++ = ch = *p++;
+ if (!ch)
+ return dst;
+ }
+ *q = '\0';
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strncmp.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strncmp.c b/libs/baselibc/src/strncmp.c
new file mode 100644
index 0000000..5235545
--- /dev/null
+++ b/libs/baselibc/src/strncmp.c
@@ -0,0 +1,21 @@
+/*
+ * strncmp.c
+ */
+
+#include <string.h>
+
+int strncmp(const char *s1, const char *s2, size_t n)
+{
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
+ unsigned char ch;
+ int d = 0;
+
+ while (n--) {
+ d = (int)(ch = *c1++) - (int)*c2++;
+ if (d || !ch)
+ break;
+ }
+
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strncpy.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strncpy.c b/libs/baselibc/src/strncpy.c
new file mode 100644
index 0000000..fffc118
--- /dev/null
+++ b/libs/baselibc/src/strncpy.c
@@ -0,0 +1,24 @@
+/*
+ * strncpy.c
+ */
+
+#include <string.h>
+
+char *strncpy(char *dst, const char *src, size_t n)
+{
+ char *q = dst;
+ const char *p = src;
+ char ch;
+
+ while (n) {
+ n--;
+ *q++ = ch = *p++;
+ if (!ch)
+ break;
+ }
+
+ /* The specs say strncpy() fills the entire buffer with NUL. Sigh. */
+ memset(q, 0, n);
+
+ return dst;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strndup.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strndup.c b/libs/baselibc/src/strndup.c
new file mode 100644
index 0000000..427162f
--- /dev/null
+++ b/libs/baselibc/src/strndup.c
@@ -0,0 +1,19 @@
+/*
+ * strndup.c
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+char *strndup(const char *s, size_t n)
+{
+ int l = n > strlen(s) ? strlen(s) + 1 : n + 1;
+ char *d = malloc(l);
+
+ if (!d)
+ return NULL;
+
+ memcpy(d, s, l);
+ d[n] = '\0';
+ return d;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strnlen.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strnlen.c b/libs/baselibc/src/strnlen.c
new file mode 100644
index 0000000..1678f4b
--- /dev/null
+++ b/libs/baselibc/src/strnlen.c
@@ -0,0 +1,18 @@
+/*
+ * strnlen()
+ */
+
+#include <string.h>
+
+size_t strnlen(const char *s, size_t maxlen)
+{
+ const char *ss = s;
+
+ /* Important: the maxlen test must precede the reference through ss;
+ since the byte beyond the maximum may segfault */
+ while ((maxlen > 0) && *ss) {
+ ss++;
+ maxlen--;
+ }
+ return ss - s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strntoimax.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strntoimax.c b/libs/baselibc/src/strntoimax.c
new file mode 100644
index 0000000..179d9e5
--- /dev/null
+++ b/libs/baselibc/src/strntoimax.c
@@ -0,0 +1,13 @@
+/*
+ * strntoimax.c
+ *
+ * strntoimax()
+ */
+
+#include <stddef.h>
+#include <inttypes.h>
+
+intmax_t strntoimax(const char *nptr, char **endptr, int base, size_t n)
+{
+ return (intmax_t) strntoumax(nptr, endptr, base, n);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strntoumax.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strntoumax.c b/libs/baselibc/src/strntoumax.c
new file mode 100644
index 0000000..56dddad
--- /dev/null
+++ b/libs/baselibc/src/strntoumax.c
@@ -0,0 +1,77 @@
+/*
+ * strntoumax.c
+ *
+ * The strntoumax() function and associated
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+static inline int digitval(int ch)
+{
+ if (ch >= '0' && ch <= '9') {
+ return ch - '0';
+ } else if (ch >= 'A' && ch <= 'Z') {
+ return ch - 'A' + 10;
+ } else if (ch >= 'a' && ch <= 'z') {
+ return ch - 'a' + 10;
+ } else {
+ return -1;
+ }
+}
+
+uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n)
+{
+ int minus = 0;
+ uintmax_t v = 0;
+ int d;
+
+ while (n && isspace((unsigned char)*nptr)) {
+ nptr++;
+ n--;
+ }
+
+ /* Single optional + or - */
+ if (n) {
+ char c = *nptr;
+ if (c == '-' || c == '+') {
+ minus = (c == '-');
+ nptr++;
+ n--;
+ }
+ }
+
+ if (base == 0) {
+ if (n >= 2 && nptr[0] == '0' &&
+ (nptr[1] == 'x' || nptr[1] == 'X')) {
+ n -= 2;
+ nptr += 2;
+ base = 16;
+ } else if (n >= 1 && nptr[0] == '0') {
+ n--;
+ nptr++;
+ base = 8;
+ } else {
+ base = 10;
+ }
+ } else if (base == 16) {
+ if (n >= 2 && nptr[0] == '0' &&
+ (nptr[1] == 'x' || nptr[1] == 'X')) {
+ n -= 2;
+ nptr += 2;
+ }
+ }
+
+ while (n && (d = digitval(*nptr)) >= 0 && d < base) {
+ v = v * base + d;
+ n--;
+ nptr++;
+ }
+
+ if (endptr)
+ *endptr = (char *)nptr;
+
+ return minus ? -v : v;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strpbrk.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strpbrk.c b/libs/baselibc/src/strpbrk.c
new file mode 100644
index 0000000..1873971
--- /dev/null
+++ b/libs/baselibc/src/strpbrk.c
@@ -0,0 +1,55 @@
+/*
+FUNCTION
+ <<strpbrk>>---find characters in string
+
+INDEX
+ strpbrk
+
+ANSI_SYNOPSIS
+ #include <string.h>
+ char *strpbrk(const char *<[s1]>, const char *<[s2]>);
+
+TRAD_SYNOPSIS
+ #include <string.h>
+ char *strpbrk(<[s1]>, <[s2]>)
+ char *<[s1]>;
+ char *<[s2]>;
+
+DESCRIPTION
+ This function locates the first occurence in the string
+ pointed to by <[s1]> of any character in string pointed to by
+ <[s2]> (excluding the terminating null character).
+
+RETURNS
+ <<strpbrk>> returns a pointer to the character found in <[s1]>, or a
+ null pointer if no character from <[s2]> occurs in <[s1]>.
+
+PORTABILITY
+<<strpbrk>> requires no supporting OS subroutines.
+*/
+
+#include <string.h>
+
+char *strpbrk(const char *s1, const char *s2)
+{
+ const char *c = s2;
+ if (!*s1)
+ return (char *) NULL;
+
+ while (*s1)
+ {
+ for (c = s2; *c; c++)
+ {
+ if (*s1 == *c)
+ break;
+ }
+ if (*c)
+ break;
+ s1++;
+ }
+
+ if (*c == '\0')
+ s1 = NULL;
+
+ return (char *) s1;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strrchr.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strrchr.c b/libs/baselibc/src/strrchr.c
new file mode 100644
index 0000000..69b238f
--- /dev/null
+++ b/libs/baselibc/src/strrchr.c
@@ -0,0 +1,19 @@
+/*
+ * strrchr.c
+ */
+
+#include <string.h>
+
+char *strrchr(const char *s, int c)
+{
+ const char *found = NULL;
+
+ while (*s) {
+ if (*s == (char)c)
+ found = s;
+ s++;
+ }
+
+ return (char *)found;
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strsep.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strsep.c b/libs/baselibc/src/strsep.c
new file mode 100644
index 0000000..44e76bd
--- /dev/null
+++ b/libs/baselibc/src/strsep.c
@@ -0,0 +1,21 @@
+/*
+ * strsep.c
+ */
+
+#include <string.h>
+
+char *strsep(char **stringp, const char *delim)
+{
+ char *s = *stringp;
+ char *e;
+
+ if (!s)
+ return NULL;
+
+ e = strpbrk(s, delim);
+ if (e)
+ *e++ = '\0';
+
+ *stringp = e;
+ return s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strspn.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strspn.c b/libs/baselibc/src/strspn.c
new file mode 100644
index 0000000..e8b213c
--- /dev/null
+++ b/libs/baselibc/src/strspn.c
@@ -0,0 +1,56 @@
+/*
+FUNCTION
+ <<strspn>>---find initial match
+
+INDEX
+ strspn
+
+ANSI_SYNOPSIS
+ #include <string.h>
+ size_t strspn(const char *<[s1]>, const char *<[s2]>);
+
+TRAD_SYNOPSIS
+ #include <string.h>
+ size_t strspn(<[s1]>, <[s2]>)
+ char *<[s1]>;
+ char *<[s2]>;
+
+DESCRIPTION
+ This function computes the length of the initial segment of
+ the string pointed to by <[s1]> which consists entirely of
+ characters from the string pointed to by <[s2]> (excluding the
+ terminating null character).
+
+RETURNS
+ <<strspn>> returns the length of the segment found.
+
+PORTABILITY
+<<strspn>> is ANSI C.
+
+<<strspn>> requires no supporting OS subroutines.
+
+QUICKREF
+ strspn ansi pure
+*/
+
+#include <string.h>
+
+size_t strspn(const char *s1, const char *s2)
+{
+ const char *s = s1;
+ const char *c;
+
+ while (*s1)
+ {
+ for (c = s2; *c; c++)
+ {
+ if (*s1 == *c)
+ break;
+ }
+ if (*c == '\0')
+ break;
+ s1++;
+ }
+
+ return s1 - s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strstr.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strstr.c b/libs/baselibc/src/strstr.c
new file mode 100644
index 0000000..8850858
--- /dev/null
+++ b/libs/baselibc/src/strstr.c
@@ -0,0 +1,11 @@
+/*
+ * strstr.c
+ */
+
+#include <string.h>
+
+char *strstr(const char *haystack, const char *needle)
+{
+ return (char *)memmem(haystack, strlen(haystack), needle,
+ strlen(needle));
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtoimax.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtoimax.c b/libs/baselibc/src/strtoimax.c
new file mode 100644
index 0000000..cd4fdca
--- /dev/null
+++ b/libs/baselibc/src/strtoimax.c
@@ -0,0 +1,3 @@
+#define TYPE intmax_t
+#define NAME strtoimax
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtok.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtok.c b/libs/baselibc/src/strtok.c
new file mode 100644
index 0000000..6b169a1
--- /dev/null
+++ b/libs/baselibc/src/strtok.c
@@ -0,0 +1,12 @@
+/*
+ * strtok.c
+ */
+
+#include <string.h>
+
+char *strtok(char *s, const char *delim)
+{
+ static char *holder;
+
+ return strtok_r(s, delim, &holder);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtok_r.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtok_r.c b/libs/baselibc/src/strtok_r.c
new file mode 100644
index 0000000..695d516
--- /dev/null
+++ b/libs/baselibc/src/strtok_r.c
@@ -0,0 +1,13 @@
+#include <string.h>
+
+char *strtok_r(char *s, const char *delim, char **holder)
+{
+ if (s)
+ *holder = s;
+
+ do {
+ s = strsep(holder, delim);
+ } while (s && !*s);
+
+ return s;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtol.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtol.c b/libs/baselibc/src/strtol.c
new file mode 100644
index 0000000..ab318cd
--- /dev/null
+++ b/libs/baselibc/src/strtol.c
@@ -0,0 +1,3 @@
+#define TYPE signed long
+#define NAME strtol
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtoll.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtoll.c b/libs/baselibc/src/strtoll.c
new file mode 100644
index 0000000..ceb924d
--- /dev/null
+++ b/libs/baselibc/src/strtoll.c
@@ -0,0 +1,3 @@
+#define TYPE signed long long
+#define NAME strtoll
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtoul.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtoul.c b/libs/baselibc/src/strtoul.c
new file mode 100644
index 0000000..d0201e1
--- /dev/null
+++ b/libs/baselibc/src/strtoul.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned long
+#define NAME strtoul
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtoull.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtoull.c b/libs/baselibc/src/strtoull.c
new file mode 100644
index 0000000..2da622a
--- /dev/null
+++ b/libs/baselibc/src/strtoull.c
@@ -0,0 +1,3 @@
+#define TYPE unsigned long long
+#define NAME strtoull
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/strtoumax.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/strtoumax.c b/libs/baselibc/src/strtoumax.c
new file mode 100644
index 0000000..c49d125
--- /dev/null
+++ b/libs/baselibc/src/strtoumax.c
@@ -0,0 +1,3 @@
+#define TYPE uintmax_t
+#define NAME strtoumax
+#include "templates/strtox.c.template"
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/templates/atox.c.template
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/templates/atox.c.template b/libs/baselibc/src/templates/atox.c.template
new file mode 100644
index 0000000..c013bb4
--- /dev/null
+++ b/libs/baselibc/src/templates/atox.c.template
@@ -0,0 +1,14 @@
+/*
+ * atox.c
+ *
+ * atoi(), atol(), atoll()
+ */
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+TYPE NAME(const char *nptr)
+{
+ return (TYPE) strntoumax(nptr, (char **)NULL, 10, ~(size_t) 0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/templates/strtox.c.template
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/templates/strtox.c.template b/libs/baselibc/src/templates/strtox.c.template
new file mode 100644
index 0000000..c22e7c7
--- /dev/null
+++ b/libs/baselibc/src/templates/strtox.c.template
@@ -0,0 +1,14 @@
+/*
+ * strtox.c
+ *
+ * strto...() functions, by macro definition
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+TYPE NAME(const char *nptr, char **endptr, int base)
+{
+ return (TYPE) strntoumax(nptr, endptr, base, ~(size_t) 0);
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/test/printf_tests.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/test/printf_tests.c b/libs/baselibc/src/test/printf_tests.c
new file mode 100644
index 0000000..f9f380f
--- /dev/null
+++ b/libs/baselibc/src/test/printf_tests.c
@@ -0,0 +1,22 @@
+#include "unittests.h"
+
+int main()
+{
+ int status = 0;
+
+ {
+ COMMENT("Testing basic snprintf functionality");
+ char buf[20];
+
+ snprintf(buf, sizeof(buf), "%08d", 55);
+ TEST(strcmp(buf, "00000055") == 0);
+
+ TEST(snprintf(buf, sizeof(buf), "01234567890123456789") == 20);
+ TEST(strcmp(buf, "0123456789012345678") == 0);
+ }
+
+ if (status != 0)
+ fprintf(stdout, "\n\nSome tests FAILED!\n");
+
+ return status;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/b32abb57/libs/baselibc/src/test/tests_glue.c
----------------------------------------------------------------------
diff --git a/libs/baselibc/src/test/tests_glue.c b/libs/baselibc/src/test/tests_glue.c
new file mode 100644
index 0000000..b18a689
--- /dev/null
+++ b/libs/baselibc/src/test/tests_glue.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+
+#if defined(linux)
+/* Connects the baselibc stdio to normal POSIX stdio */
+size_t write(int fd, const void *buf, size_t count);
+
+static size_t stdio_write(FILE *instance, const char *bp, size_t n)
+{
+ if (instance == stdout)
+ return write(1, bp, n);
+ else
+ return write(2, bp, n);
+}
+#else
+#error No suitable write() implementation.
+#endif
+
+
+static struct File_methods stdio_methods = {
+ &stdio_write, NULL
+};
+
+static struct File _stdout = {
+ &stdio_methods
+};
+
+static struct File _stderr = {
+ &stdio_methods
+};
+
+FILE* const stdout = &_stdout;
+FILE* const stderr = &_stderr;
+
[4/5] incubator-mynewt-larva git commit: Fix check for whether uart
was open on not when tx'ing in blocking mode.
Posted by ma...@apache.org.
Fix check for whether uart was open on not when tx'ing
in blocking mode.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/8de028fa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/8de028fa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/8de028fa
Branch: refs/heads/master
Commit: 8de028fae3cc52141fe935eeb0cb2ce94a0e2a31
Parents: 2ce1676
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Nov 23 15:12:52 2015 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Nov 23 15:12:52 2015 -0800
----------------------------------------------------------------------
hw/mcu/stm/stm32f4xx/src/hal_uart.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/8de028fa/hw/mcu/stm/stm32f4xx/src/hal_uart.c
----------------------------------------------------------------------
diff --git a/hw/mcu/stm/stm32f4xx/src/hal_uart.c b/hw/mcu/stm/stm32f4xx/src/hal_uart.c
index 3ca76a6..17d91f0 100644
--- a/hw/mcu/stm/stm32f4xx/src/hal_uart.c
+++ b/hw/mcu/stm/stm32f4xx/src/hal_uart.c
@@ -146,7 +146,7 @@ hal_uart_blocking_tx(int port, uint8_t data)
USART_TypeDef *regs;
u = &uarts[port];
- if (port >= UART_CNT || u->u_open) {
+ if (port >= UART_CNT || !u->u_open) {
return;
}
regs = u->u_regs;
[3/5] incubator-mynewt-larva git commit: nffs_misc_reset() can fail
if there's no memory.
Posted by ma...@apache.org.
nffs_misc_reset() can fail if there's no memory.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/2ce16767
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/2ce16767
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/2ce16767
Branch: refs/heads/master
Commit: 2ce16767af6014388ae05304e6957fe09ebe74b2
Parents: b32abb5
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Nov 23 14:50:36 2015 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Nov 23 14:50:36 2015 -0800
----------------------------------------------------------------------
libs/nffs/src/nffs_restore.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/2ce16767/libs/nffs/src/nffs_restore.c
----------------------------------------------------------------------
diff --git a/libs/nffs/src/nffs_restore.c b/libs/nffs/src/nffs_restore.c
index d7328fa..f776717 100644
--- a/libs/nffs/src/nffs_restore.c
+++ b/libs/nffs/src/nffs_restore.c
@@ -916,7 +916,10 @@ nffs_restore_full(const struct nffs_area_desc *area_descs)
int i;
/* Start from a clean state. */
- nffs_misc_reset();
+ rc = nffs_misc_reset();
+ if (rc) {
+ return rc;
+ }
nffs_restore_largest_block_data_len = 0;
/* Read each area from flash. */