X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Flibc-extension.cc;h=fbb4b61652fe5094f32fee613f4d52f682cce5bf;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=198ecbb7fe31cc3d3f6d0f4d5a17ef6f6c6371d5;hpb=10c31ddf558110fefea0e0cbc1eca9ff05c54036;p=lilypond.git diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 198ecbb7fe..fbb4b61652 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -1,101 +1,111 @@ /* - libc-extension.cc -- compensate for lacking libc functions. + This file is part of LilyPond, the GNU music typesetter. + Copyright (C) 1997--2014 Han-Wen Nienhuys + Jan Nieuwenhuizen - source file of the flowerlib + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - (c) 1997--2003 Han-Wen Nienhuys - Jan Nieuwenhuizen + LilyPond 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ -#include -#include -#include +#include +#include +#include +#include +#include + +using namespace std; + #include "libc-extension.hh" -/* - urg: why soo wierd? - */ -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 */ + *p = (char)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 */ + *p = (char)toupper (*p); /* a macro on some compilers */ } return start; } - #if !HAVE_MEMMEM /** locate a substring. #memmem# finds the first occurrence of - #needle# in #haystack#. This is not ANSI-C. + #needle# in #haystack#. This is not ANSI-C. - The prototype is not in accordance with the Linux Programmer's - Manual v1.15, but it is with /usr/include/string.h */ + The prototype is not in accordance with the Linux Programmer's + Manual v1.15, but it is with /usr/include/string.h */ -Byte * -_memmem (Byte const *haystack, int haystack_len, - Byte const *needle,int needle_len) +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 + 1; - Byte 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) { - Byte const *subneedle = needle; - Byte const *subhaystack = haystack; - while (subneedle < end_needle) + unsigned char const *subneedle = needle; + unsigned char const *subhaystack = haystack; + while (subneedle < end_needle) if (*subneedle++ != *subhaystack++) - goto next; - - // completed the needle. Gotcha. - return (Byte *) haystack; - next: - haystack++; + goto next; + + /* Completed the needle. Gotcha. */ + return (unsigned char *) haystack; +next: + haystack++; } return 0; } void * memmem (void const *haystack, int haystack_len, - void const *needle,int needle_len) + void const *needle, int needle_len) { - Byte const* haystack_byte_c = (Byte const*)haystack; - Byte const* needle_byte_c = (Byte 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); } #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) + const unsigned char *q = p + n; + while (q > p) { if (*--q == c) - return (Byte*)q; + return (unsigned char *)q; } return 0; } - template inline void my_swap (T &t1, T &t2, T &tmp) @@ -105,52 +115,62 @@ my_swap (T &t1, T &t2, T &tmp) t2 = tmp; } -Byte* -strrev (Byte* byte, int length_i) +unsigned char * +memrev (unsigned char *byte, int length) { - Byte tmp_byte; - - Byte* left = byte; - Byte* right = byte + length_i; + 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; } -#if ! HAVE_LRINT -#define lrint(__x) ((long)(double) __x) +/* + 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 - -#if !HAVE_ISINF -int -isinf (double x) -{ - return x && ( x == x/ 2) ; -} - -#endif +/* } namespace std */