]> git.donarmstrong.com Git - lilypond.git/blob - flower/libc-extension.cc
(my_round): ANSI-C compatible rounding.
[lilypond.git] / flower / libc-extension.cc
1 /*
2   libc-extension.cc --  compensate for lacking libc functions.
3
4
5   source file of the flowerlib
6
7   (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8          Jan Nieuwenhuizen <janneke@gnu.org>
9 */
10
11 #include <math.h>
12
13 #include <stdio.h>
14 #include <string.h>
15 #include <ctype.h>
16 #include "libc-extension.hh"
17
18 char* 
19 strnlwr (char* start ,int n)
20 {
21   char * p = start + n;
22   while (--p >= start) 
23     {
24       *p = tolower (*p);    /* a macro on some compilers */
25     }
26   return start;
27 }
28
29 char* 
30 strnupr (char* start, int n)
31 {
32   char * p = start + n;
33   while (--p >= start) 
34     {
35       *p = toupper (*p);    /* a macro on some compilers */
36     }
37   return start;
38 }
39
40 /*
41   There are some strange problems with round() on early glibcs.
42  */
43 double
44 my_round (double x)
45 {
46   return  floor (x -0.5)+ 1.0 ;
47 }
48
49
50 #if !HAVE_ISINF
51 int
52 isinf (double x)
53 {
54   return x && ( x == x/ 2) ;
55 }
56 #endif
57
58
59 #if !HAVE_MEMMEM
60
61 /** locate a substring. #memmem# finds the first occurrence of
62   #needle# in #haystack#.  This is not ANSI-C.
63
64   The prototype is not in accordance with the Linux Programmer's
65   Manual v1.15, but it is with /usr/include/string.h   */
66
67 Byte *
68 _memmem (Byte const *haystack, int haystack_len,
69         Byte const *needle,int needle_len)
70 {
71   Byte const * end_haystack = haystack + haystack_len - needle_len + 1;
72   Byte const * end_needle = needle + needle_len ;
73
74   /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation
75      is the spice of life */
76   while (haystack < end_haystack) 
77     {
78       Byte const *subneedle = needle;
79       Byte const *subhaystack = haystack;
80       while (subneedle < end_needle) 
81         if (*subneedle++ != *subhaystack++)
82           goto next;
83         
84       /* Completed the needle.  Gotcha.  */
85       return (Byte *) haystack;
86       next:
87         haystack++;
88     }
89   return 0;
90 }
91
92 void *
93 memmem (void const *haystack, int haystack_len,
94         void const *needle,int needle_len)
95 {
96   Byte const* haystack_byte_c = (Byte const*)haystack;
97   Byte const* needle_byte_c = (Byte const*)needle;
98   return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len);
99 }
100
101 #endif
102
103 Byte *
104 memrchr (Byte const * p, int n, char c)
105 {
106   const    Byte * q = p+n;
107   while (q > p) 
108     {
109       if (*--q == c)
110         return (Byte*)q;
111     }
112   return 0;
113 }
114
115
116 template<class T>
117 inline void
118 my_swap (T &t1, T &t2, T &tmp)
119 {
120   tmp = t1;
121   t1 = t2;
122   t2 = tmp;
123 }
124
125 Byte*
126 strrev (Byte* byte, int length_i)
127 {
128   Byte tmp_byte;
129   
130   Byte* left = byte;
131   Byte* right = byte + length_i;
132
133   while (right > left) 
134     {
135       my_swap (*right-- , *left++ , tmp_byte);
136     }
137   return byte;
138 }
139
140 #if ! HAVE_SNPRINTF
141 int 
142 snprintf (char *str, size_t, char const *format, ...)
143 {
144   va_list ap;
145   va_start (ap, format);
146   int i = vsprintf (str, format, ap);
147   va_end (ap);
148   return i;
149 }
150 #endif
151
152 #if ! HAVE_VSNPRINTF
153 int 
154 vsnprintf (char *str, size_t, char const *format, va_list args)
155 {
156   int i = vsprintf (str, format, args);
157   return i;
158 }
159 #endif