X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Flibc-extension.cc;h=cca8771e7348b92d0bdd614f2fdcd7d860622546;hb=619c2c2587f5fcbfa8573023bee0a097e30bf70a;hp=8ced60f22ca70556df9d670416f57114c81df90c;hpb=94dfb814b6bcd17f05e3bb1ff61de9b9e526c3b7;p=lilypond.git diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 8ced60f22c..cca8771e73 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -1,10 +1,9 @@ /* libc-extension.cc -- compensate for lacking libc functions. - source file of the flowerlib - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2009 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -12,50 +11,34 @@ #include #include #include +#include + +using namespace std; #include "libc-extension.hh" -char* -strnlwr (char* start ,int n) +char * +strnlwr (char *start, int n) { - char * p = start + n; - while (--p >= start) + char *p = start + n; + while (--p >= start) { *p = tolower (*p); /* a macro on some compilers */ } return start; } -char* -strnupr (char* start, int n) +char * +strnupr (char *start, int n) { - char * p = start + n; - while (--p >= start) + char *p = start + n; + while (--p >= start) { *p = toupper (*p); /* a macro on some compilers */ } return start; } -/* - There are some strange problems with round() on early glibcs. -*/ -double -my_round (double x) -{ - return floor (x -0.5)+ 1.0 ; -} - -#ifndef isinf -#if !HAVE_ISINF -int -isinf (double x) -{ - return x && ( x == x/ 2) ; -} -#endif -#endif - #if !HAVE_MEMMEM /** locate a substring. #memmem# finds the first occurrence of @@ -66,21 +49,21 @@ isinf (double x) unsigned char * _memmem (unsigned char const *haystack, int haystack_len, - unsigned char const *needle,int needle_len) + unsigned char const *needle, int needle_len) { - unsigned char const * end_haystack = haystack + haystack_len - needle_len + 1; - unsigned char const * end_needle = needle + needle_len ; + unsigned char const *end_haystack = haystack + haystack_len - needle_len + 1; + unsigned char const *end_needle = needle + needle_len; /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation is the spice of life */ - while (haystack < end_haystack) + while (haystack < end_haystack) { unsigned char const *subneedle = needle; unsigned char const *subhaystack = haystack; - while (subneedle < end_needle) - if (*subneedle++ != *subhaystack++) + while (subneedle < end_needle) + if (*subneedle++ != *subhaystack++) goto next; - + /* Completed the needle. Gotcha. */ return (unsigned char *) haystack; next: @@ -91,10 +74,10 @@ _memmem (unsigned char const *haystack, int haystack_len, void * memmem (void const *haystack, int haystack_len, - void const *needle,int needle_len) + void const *needle, int needle_len) { - unsigned char const* haystack_byte_c = (unsigned char const*)haystack; - unsigned char const* needle_byte_c = (unsigned char const*)needle; + unsigned char const *haystack_byte_c = (unsigned char const *)haystack; + unsigned char const *needle_byte_c = (unsigned char const *)needle; return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len); } @@ -104,15 +87,14 @@ unsigned char * memrchr (unsigned char const *p, int n, char c) { const unsigned char *q = p + n; - while (q > p) + while (q > p) { if (*--q == c) - return (unsigned char*)q; + return (unsigned char *)q; } return 0; } - template inline void my_swap (T &t1, T &t2, T &tmp) @@ -123,121 +105,61 @@ my_swap (T &t1, T &t2, T &tmp) } unsigned char * -strrev (unsigned char *byte, int length) +memrev (unsigned char *byte, int length) { unsigned char tmp_byte; unsigned char *left = byte; unsigned char *right = byte + length; - while (right > left) - my_swap (*right--, *left++ , tmp_byte); + while (right > left) + my_swap (*right--, *left++, tmp_byte); return byte; } +/* + There are some strange problems with round() on early glibcs. +*/ +double +my_round (double x) +{ + return floor (x -0.5)+ 1.0; +} + +/* namespace std { */ + +#ifndef isinf +#if !HAVE_ISINF +int +isinf (double x) +{ + return x && (x == x/ 2); +} +#endif +#endif + #if ! HAVE_SNPRINTF -int -snprintf (char *str, size_t, char const *format, ...) +int +snprintf (char *str, size_t n, char const *format, ...) { va_list ap; va_start (ap, format); int i = vsprintf (str, format, ap); + if (i > 0 && (unsigned) i > n) + assert (false); va_end (ap); return i; } #endif #if ! HAVE_VSNPRINTF -int -vsnprintf (char *str, size_t, char const *format, va_list args) +int +vsnprintf (char *str, size_t n, char const *format, va_list args) { int i = vsprintf (str, format, args); + if (i > 0 && (unsigned) i > n) + assert (false); return i; } #endif -#include - -extern "C" { - -#if ! HAVE_FOPENCOOKIE -#if HAVE_FUNOPEN - - FILE * - fopencookie (void *cookie, char const *mode, cookie_io_functions_t *fun) - { - return funopen (cookie, fun->read, fun->write, fun->seek, fun->close); - } - -#else /* ! HAVE_FUNOPEN */ - -#include -#include "memory-stream.hh" - - static bool - is_memory_stream (void *foo) - { - Memory_out_stream* cookie = (Memory_out_stream*) foo; - return dynamic_cast (cookie); - } - - FILE * - fopencookie (void *cookie, char const *modes, cookie_io_functions_t io_funcs) - { - (void) cookie; - (void) modes; - (void) io_funcs; - if (is_memory_stream (cookie)) - return (FILE*) cookie; - assert (false); - return 0; - } - -#undef fclose - int - handle_cookie_io_fclose (FILE *file) - { - if (is_memory_stream (file)) - return Memory_out_stream::cleaner (file); - return fclose (file); - } - -#undef fprintf - int - handle_cookie_io_fprintf (FILE *file, char const *format, ...) - { - va_list ap; - va_start (ap, format); - if (is_memory_stream (file)) - { - static char buf[1024]; - int i = vsnprintf (buf, sizeof (buf), format, ap); - if (i == -1) - assert (false); - return Memory_out_stream::writer (file, buf, i); - } - int i = vfprintf (file, format, ap); - va_end (ap); - return i; - } - -#ifdef std_putc -#define putc std_putc -#else -#undef putc -#endif - int - handle_cookie_io_putc (int c, FILE *file) - { - if (is_memory_stream (file)) - { - char buf[1]; - buf[0] = (char) c; - return Memory_out_stream::writer (file, buf, 1); - } - return putc (c, file); - } - -#endif /* ! HAVE_FUNOPEN */ -#endif /* ! HAVE_FOPENCOOKIE */ - -} /* extern C */ +/* } namespace std */