X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Flibc-extension.cc;h=697c527c447f8d57117361bb0f7940c12e2b665b;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=6e9a9b77a6eaa2f726a703d7b4294cfbb92cf674;hpb=01ddcb81463d7a68530971100469d3e2baf8c94b;p=lilypond.git diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 6e9a9b77a6..697c527c44 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -1,112 +1,165 @@ /* libc-extension.cc -- compensate for lacking libc functions. - source file of the flowerlib - (c) 1997 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys + Jan Nieuwenhuizen */ -#include -#include -#include -#include "libc-extension.hh" +#include +#include +#include +#include +#include + +using namespace std; + +#include "libc-extension.hh" -char* -strnlwr( char* start_l ,int n) +char * +strnlwr (char *start, int n) { - char * p = start_l + n; - while ( --p >= start_l) { - *p = tolower( *p ); /* a macro on some compilers */ + char *p = start + n; + while (--p >= start) + { + *p = tolower (*p); /* a macro on some compilers */ } - return start_l; + return start; } -char* -strnupr( char* start_l, int n) +char * +strnupr (char *start, int n) { - char * p = start_l + n; - while ( --p >= start_l) { - *p = toupper( *p ); /* a macro on some compilers */ + char *p = start + n; + while (--p >= start) + { + *p = toupper (*p); /* a macro on some compilers */ } - return start_l; + return start; } #if !HAVE_MEMMEM /** locate a substring. #memmem# finds the first occurrence of - #needle# in #haystack# - */ + #needle# in #haystack#. This is not ANSI-C. -char * -memmem(Byte const * haystack, int haystack_len, - Byte const *needle,int needle_len) + The prototype is not in accordance with the Linux Programmer's + Manual v1.15, but it is with /usr/include/string.h */ + +unsigned char * +_memmem (unsigned char const *haystack, int haystack_len, + unsigned char const *needle, int needle_len) { - Byte const * end_haystack = haystack + haystack_len - needle_len; - Byte const * end_needle = needle + needle_len ; - - /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation - is the spice of life */ - while (haystack < end_haystack) { - Byte const *subneedle_l = needle; - Byte const *subhaystack_l = haystack; - while (subneedle_l < end_needle) { - if (*subneedle_l++ != *subhaystack_l++) - goto next; // yeah. I should be prosecuted. - } - - // completed the needle. Gotcha. - return (char*) haystack; + 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) + { + unsigned char const *subneedle = needle; + unsigned char const *subhaystack = haystack; + while (subneedle < end_needle) + if (*subneedle++ != *subhaystack++) + goto next; + + /* Completed the needle. Gotcha. */ + return (unsigned char *) haystack; next: - haystack++; + haystack++; } - return 0; + return 0; +} + +void * +memmem (void const *haystack, int haystack_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; + return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len); } + #endif -Byte * -memrchr(Byte const * p, int n, char c) +unsigned char * +memrchr (unsigned char const *p, int n, char c) { - const Byte * q = p+n; - while (q > p) { - if (*--q == c) - return (Byte*)q; + const unsigned char *q = p + n; + while (q > p) + { + if (*--q == c) + return (unsigned char *)q; } - return 0; + return 0; } - template inline void -my_swap(T &t1, T &t2, T &tmp) +my_swap (T &t1, T &t2, T &tmp) { - tmp = t1; - t1 = t2; - t2 = tmp; + tmp = t1; + t1 = t2; + t2 = tmp; } -Byte* -strrev( Byte* byte_l, int length_i ) +unsigned char * +memrev (unsigned char *byte, int length) { - Byte tmp_byte; - - Byte* left_l = byte_l; - Byte* right_l = byte_l + length_i; + unsigned char tmp_byte; + unsigned char *left = byte; + unsigned char *right = byte + length; - while ( right_l > left_l ) { - my_swap(*right_l-- , *left_l++ , tmp_byte); - } - return byte_l; + 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); - va_end(ap); - return i; + 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 n, char const *format, va_list args) +{ + int i = vsprintf (str, format, args); + if (i > 0 && (unsigned) i > n) + assert (false); + return i; +} +#endif + +/* } namespace std */