]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/libc-extension.cc
Run `make grand-replace'.
[lilypond.git] / flower / libc-extension.cc
index 9752c046942257efd560d9a7e114815091afbf84..697c527c447f8d57117361bb0f7940c12e2b665b 100644 (file)
 /*
   libc-extension.cc --  compensate for lacking libc functions.
 
-
   source file of the flowerlib
 
-  (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-         Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
+#include <cmath>
+#include <cstdio>
+#include <cstring>
+#include <cctype>
+#include <cassert>
+
+using namespace std;
+
 #include "libc-extension.hh"
 
-/*
-  urg: why soo wierd?
- */
-char* 
-strnlwr (char* start_l ,int n)
+char *
+strnlwr (char *start, int n)
 {
-  char * p = start_l + n;
-  while (--p >= start_l) 
+  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) 
+  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#.  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_l = needle;
-      Byte const *subhaystack_l = haystack;
-      while (subneedle_l < end_needle) 
-        if (*subneedle_l++ != *subhaystack_l++)
+      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++;
+
+      /* 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)
+{
+  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<class T>
 inline void
 my_swap (T &t1, T &t2, T &tmp)
@@ -96,39 +104,62 @@ my_swap (T &t1, T &t2, T &tmp)
   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);
+  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
 
+/* } namespace std */