17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This is an example of a header file for platforms/compilers that do
27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * not come with stdint.h/stddef.h/stdbool.h/string.h. To use it, define
37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * PB_SYSTEM_HEADER as "pb_syshdr.h", including the quotes, and add the
47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * extra folder to your include path.
57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen *
67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * It is very likely that you will need to customize this file to suit
77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * your platform. For any compiler that supports C99, this file should
87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * not be necessary.
97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */
107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef _PB_SYSHDR_H_
127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define _PB_SYSHDR_H_
137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* stdint.h subset */
157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef HAVE_STDINT_H
167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdint.h>
177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else
187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* You will need to modify these to match the word size of your platform. */
197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef signed char int8_t;
207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef unsigned char uint8_t;
217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef signed short int16_t;
227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef unsigned short uint16_t;
237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef signed int int32_t;
247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef unsigned int uint32_t;
257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef signed long long int64_t;
267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef unsigned long long uint64_t;
277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* stddef.h subset */
307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef HAVE_STDDEF_H
317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stddef.h>
327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else
337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef uint32_t size_t;
357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define offsetof(st, m) ((size_t)(&((st *)0)->m))
367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef NULL
387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define NULL 0
397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* stdbool.h subset */
447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef HAVE_STDBOOL_H
457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdbool.h>
467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else
477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifndef __cplusplus
497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohentypedef int bool;
507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define false 0
517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define true 1
527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* stdlib.h subset */
577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef PB_ENABLE_MALLOC
587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef HAVE_STDLIB_H
597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdlib.h>
607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else
617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenvoid *realloc(void *ptr, size_t size);
627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenvoid free(void *ptr);
637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* string.h subset */
677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#ifdef HAVE_STRING_H
687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h>
697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#else
707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Implementations are from the Public Domain C Library (PDCLib). */
727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic size_t strlen( const char * s )
737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    size_t rc = 0;
757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    while ( s[rc] )
767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        ++rc;
787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return rc;
807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic void * memcpy( void *s1, const void *s2, size_t n )
837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    char * dest = (char *) s1;
857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    const char * src = (const char *) s2;
867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    while ( n-- )
877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        *dest++ = *src++;
897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return s1;
917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenstatic void * memset( void * s, int c, size_t n )
947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    unsigned char * p = (unsigned char *) s;
967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    while ( n-- )
977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        *p++ = (unsigned char) c;
997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return s;
1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#endif
105