X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Flibc-extension.cc;h=fee28d8e15d313f1f7e9e5ea88f85d54316b8a97;hb=52148831ff218cb35bb601b0e9b2513a8ef2a1a3;hp=7078a3be4e7e5a4cc643fff1fba49e0dd7f1771d;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 7078a3be4e..fee28d8e15 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -1,16 +1,30 @@ /* - libc-extension.cc -- compensate for lacking libc functions. + This file is part of LilyPond, the GNU music typesetter. - source file of the flowerlib - - (c) 1997--2005 Han-Wen Nienhuys + Copyright (C) 1997--2011 Han-Wen Nienhuys Jan Nieuwenhuizen + + 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. + + 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 + +using namespace std; #include "libc-extension.hh" @@ -20,7 +34,7 @@ strnlwr (char *start, int n) 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; } @@ -31,30 +45,11 @@ strnupr (char *start, int n) 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; } -/* - 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 @@ -121,7 +116,7 @@ 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; @@ -132,13 +127,36 @@ strrev (unsigned char *byte, int length) 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, ...) +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; } @@ -146,99 +164,13 @@ snprintf (char *str, size_t, char const *format, ...) #if ! HAVE_VSNPRINTF int -vsnprintf (char *str, size_t, char const *format, va_list args) +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) - { - (void) mode; -#if 0 - return funopen (cookie, fun.read, fun.write, fun.seek, fun.close); -#else - return funopen (cookie, - (int (*) (void *, char *, int)) fun.read, - (int (*) (void *, char const *, int)) fun.write, - (fpos_t (*) (void *, fpos_t, int)) fun.seek, - (int (*) (void *)) fun.close); - -#endif - } - -#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; - } - - int - handle_cookie_io_fclose (FILE *file) - { - if (is_memory_stream (file)) - return Memory_out_stream::cleaner (file); - return fclose (file); - } - - 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; - } - - 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 */