]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
Move jit-string.c content to jit-util.c.
authorAleksey Demakov <ademakov@gmail.com>
Fri, 12 Oct 2012 18:53:15 +0000 (22:53 +0400)
committerAleksey Demakov <ademakov@gmail.com>
Fri, 12 Oct 2012 18:53:15 +0000 (22:53 +0400)
ChangeLog
doc/Makefile.am
doc/libjit.texi
jit/Makefile.am
jit/jit-string.c [deleted file]
jit/jit-util.c

index 4039cf3cbc4573774896c8751070479e08da63e3..66691b8cf44bf2857edb68f31f3641ee01697a3a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,8 @@
 2012-10-12  Aleksey Demakov  <ademakov@gmail.com>
 
        * jit/jit-memory.h: remove file.
-       * jit/jit-memory.c: rename to jit/jit-util.c
+       * jit/jit-memory.c: rename to jit/jit-util.c.
+       * jit/jit-string.c: append to jit/jit-util.c.
 
 2012-10-08  Aleksey Demakov  <ademakov@gmail.com>
 
index 36e809c4dd846ee26feb59d1341c771f06313bb4..8f3e0f0044dde0d49550d70d4ee2e254e962544f 100644 (file)
@@ -23,7 +23,6 @@ libjit_TEXINFOS = \
        $(srcdir)/libjitext-meta.texi \
        $(srcdir)/libjitext-reg-alloc.texi \
        $(srcdir)/libjitext-rules-interp.texi \
-       $(srcdir)/libjitext-string.texi \
        $(srcdir)/libjitext-type.texi \
        $(srcdir)/libjitext-value.texi \
        $(srcdir)/libjitext-walk.texi \
@@ -85,9 +84,6 @@ $(srcdir)/libjitext-reg-alloc.texi: $(top_srcdir)/jit/jit-reg-alloc.c
 $(srcdir)/libjitext-rules-interp.texi: $(top_srcdir)/jit/jit-rules-interp.c
        $(SHELL) $(srcdir)/extract-docs.sh $< >$@
 
-$(srcdir)/libjitext-string.texi: $(top_srcdir)/jit/jit-string.c
-       $(SHELL) $(srcdir)/extract-docs.sh $< >$@
-
 $(srcdir)/libjitext-type.texi: $(top_srcdir)/jit/jit-type.c
        $(SHELL) $(srcdir)/extract-docs.sh $< >$@
 
index b67ec247997b0d27a0c335aa95a31381830c1870..3e2c562b07a679ec42032dc9b88453667137355a 100644 (file)
@@ -1059,7 +1059,6 @@ that it itself uses internally, but which may also be useful to front ends.
 
 @include libjitext-alloc.texi
 @include libjitext-util.texi
-@include libjitext-string.texi
 @include libjitext-meta.texi
 @include libjitext-apply.texi
 @include libjitext-walk.texi
index 827925c7367b920feee54cc45c71300f3e2e4e07..eda454c5f1964eaee5c8e9f7a97d2de452eb25de 100644 (file)
@@ -68,7 +68,6 @@ libjit_la_SOURCES = \
        jit-rules-x86-64.c \
        jit-setjmp.h \
        jit-signal.c \
-       jit-string.c \
        jit-symbol.c \
        jit-thread.c \
        jit-thread.h \
diff --git a/jit/jit-string.c b/jit/jit-string.c
deleted file mode 100644 (file)
index 7deefbf..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * jit-string.c - String handling routines.
- *
- * Copyright (C) 2004  Southern Storm Software, Pty Ltd.
- *
- * This file is part of the libjit library.
- *
- * The libjit library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation, either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * The libjit library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the libjit library.  If not, see
- * <http://www.gnu.org/licenses/>.
- */
-
-#include <jit/jit-util.h>
-#include "jit-config.h"
-#ifdef HAVE_STRING_H
-       #include <string.h>
-#elif defined(HAVE_STRINGS_H)
-       #include <strings.h>
-#endif
-#include <stdio.h>
-#ifdef HAVE_STDARG_H
-       #include <stdarg.h>
-#elif HAVE_VARARGS_H
-       #include <varargs.h>
-#endif
-
-/*@
- * @section String operations
- * @cindex String operations
- *
- * The following functions are provided to manipulate NULL-terminated
- * strings.  It is highly recommended that you use these functions in
- * preference to system functions, because the corresponding system
- * functions are extremely non-portable.
-@*/
-
-/*@
- * @deftypefun {unsigned int} jit_strlen (const char *@var{str})
- * Returns the length of @var{str}.
- * @end deftypefun
-@*/
-unsigned int jit_strlen(const char *str)
-{
-#ifdef HAVE_STRLEN
-       return (unsigned int)(strlen(str));
-#else
-       unsigned int len = 0;
-       while(*str++ != '\0')
-       {
-               ++len;
-       }
-       return len;
-#endif
-}
-
-/*@
- * @deftypefun {char *} jit_strcpy (char *@var{dest}, const char *@var{src})
- * Copy the string at @var{src} to @var{dest}.  Returns @var{dest}.
- * @end deftypefun
-@*/
-char *jit_strcpy(char *dest, const char *src)
-{
-#ifdef HAVE_STRCPY
-       return strcpy(dest, src);
-#else
-       char ch;
-       char *d = dest;
-       while((ch = *src++) != '\0')
-       {
-               *d++ = ch;
-       }
-       *d = '\0';
-       return dest;
-#endif
-}
-
-/*@
- * @deftypefun {char *} jit_strcat (char *@var{dest}, const char *@var{src})
- * Copy the string at @var{src} to the end of the string at @var{dest}.
- * Returns @var{dest}.
- * @end deftypefun
-@*/
-char *jit_strcat(char *dest, const char *src)
-{
-#ifdef HAVE_STRCAT
-       return strcat(dest, src);
-#else
-       char ch;
-       char *d = dest + jit_strlen(dest);
-       while((ch = *src++) != '\0')
-       {
-               *d++ = ch;
-       }
-       *d = '\0';
-       return dest;
-#endif
-}
-
-/*@
- * @deftypefun {char *} jit_strncpy (char *@var{dest}, const char *@var{src}, unsigned int @var{len})
- * Copy at most @var{len} characters from the string at @var{src} to
- * @var{dest}.  Returns @var{dest}.
- * @end deftypefun
-@*/
-char *jit_strncpy(char *dest, const char *src, unsigned int len)
-{
-#ifdef HAVE_STRNCPY
-       return strncpy(dest, src, len);
-#else
-       char ch;
-       char *d = dest;
-       while(len > 0 && (ch = *src++) != '\0')
-       {
-               *d++ = ch;
-               --len;
-       }
-       while(len > 0)
-       {
-               *d++ = '\0';
-               --len;
-       }
-       return dest;
-#endif
-}
-
-/*@
- * @deftypefun {char *} jit_strdup (const char *@var{str})
- * Allocate a block of memory using @code{jit_malloc} and copy
- * @var{str} into it.  Returns NULL if @var{str} is NULL or there
- * is insufficient memory to perform the @code{jit_malloc} operation.
- * @end deftypefun
-@*/
-char *jit_strdup(const char *str)
-{
-       char *new_str;
-       if(!str)
-       {
-               return 0;
-       }
-       new_str = jit_malloc(strlen(str) + 1);
-       if(!new_str)
-       {
-               return 0;
-       }
-       strcpy(new_str, str);
-       return new_str;
-}
-
-/*@
- * @deftypefun {char *} jit_strndup (const char *@var{str}, unsigned int @var{len})
- * Allocate a block of memory using @code{jit_malloc} and copy at most
- * @var{len} characters of @var{str} into it.  The copied string is then
- * NULL-terminated.  Returns NULL if @var{str} is NULL or there
- * is insufficient memory to perform the @code{jit_malloc} operation.
- * @end deftypefun
-@*/
-char *jit_strndup(const char *str, unsigned int len)
-{
-       char *new_str;
-       if(!str)
-       {
-               return 0;
-       }
-       new_str = jit_malloc(len + 1);
-       if(!new_str)
-       {
-               return 0;
-       }
-       jit_memcpy(new_str, str, len);
-       new_str[len] = '\0';
-       return new_str;
-}
-
-/*@
- * @deftypefun int jit_strcmp (const char *@var{str1}, const char *@var{str2})
- * Compare the two strings @var{str1} and @var{str2}, returning
- * a negative, zero, or positive value depending upon their relationship.
- * @end deftypefun
-@*/
-int jit_strcmp(const char *str1, const char *str2)
-{
-#ifdef HAVE_STRCMP
-       return strcmp(str1, str2);
-#else
-       int ch1, ch2;
-       for(;;)
-       {
-               ch1 = *str1++;
-               ch2 = *str2++;
-               if(ch1 != ch2 || !ch1 || !ch2)
-               {
-                       break;
-               }
-       }
-       return (ch1 - ch2);
-#endif
-}
-
-/*@
- * @deftypefun int jit_strncmp (const char *@var{str1}, const char *@var{str2}, unsigned int @var{len})
- * Compare the two strings @var{str1} and @var{str2}, returning
- * a negative, zero, or positive value depending upon their relationship.
- * At most @var{len} characters are compared.
- * @end deftypefun
-@*/
-int jit_strncmp(const char *str1, const char *str2, unsigned int len)
-{
-#ifdef HAVE_STRNCMP
-       return strncmp(str1, str2, len);
-#else
-       int ch1, ch2;
-       while(len > 0)
-       {
-               ch1 = *str1++;
-               ch2 = *str2++;
-               if(ch1 != ch2 || !ch1 || !ch2)
-               {
-                       return (ch1 - ch2);
-               }
-               --len;
-       }
-       return 0;
-#endif
-}
-
-/*@
- * @deftypefun int jit_stricmp (const char *@var{str1}, const char *@var{str2})
- * Compare the two strings @var{str1} and @var{str2}, returning
- * a negative, zero, or positive value depending upon their relationship.
- * Instances of the English letters A to Z are converted into their
- * lower case counterparts before comparison.
- *
- * Note: this function is guaranteed to use English case comparison rules,
- * no matter what the current locale is set to, making it suitable for
- * comparing token tags and simple programming language identifiers.
- *
- * Locale-sensitive string comparison is complicated and usually specific
- * to the front end language or its supporting runtime library.  We
- * deliberately chose not to handle this in @code{libjit}.
- * @end deftypefun
-@*/
-int jit_stricmp(const char *str1, const char *str2)
-{
-       int ch1, ch2;
-       for(;;)
-       {
-               ch1 = *str1++;
-               ch2 = *str2++;
-               if(ch1 >= 'A' && ch1 <= 'Z')
-               {
-                       ch1 = ch1 - 'A' + 'a';
-               }
-               if(ch2 >= 'A' && ch2 <= 'Z')
-               {
-                       ch2 = ch2 - 'A' + 'a';
-               }
-               if(ch1 != ch2 || !ch1 || !ch2)
-               {
-                       break;
-               }
-       }
-       return (ch1 - ch2);
-}
-
-/*@
- * @deftypefun int jit_strnicmp (const char *@var{str1}, const char *@var{str2}, unsigned int @var{len})
- * Compare the two strings @var{str1} and @var{str2}, returning
- * a negative, zero, or positive value depending upon their relationship.
- * At most @var{len} characters are compared.  Instances of the English
- * letters A to Z are converted into their lower case counterparts
- * before comparison.
- * @end deftypefun
-@*/
-int jit_strnicmp(const char *str1, const char *str2, unsigned int len)
-{
-       int ch1, ch2;
-       while(len > 0)
-       {
-               ch1 = *str1++;
-               ch2 = *str2++;
-               if(ch1 >= 'A' && ch1 <= 'Z')
-               {
-                       ch1 = ch1 - 'A' + 'a';
-               }
-               if(ch2 >= 'A' && ch2 <= 'Z')
-               {
-                       ch2 = ch2 - 'A' + 'a';
-               }
-               if(ch1 != ch2 || !ch1 || !ch2)
-               {
-                       return (ch1 - ch2);
-               }
-               --len;
-       }
-       return 0;
-}
-
-/*@
- * @deftypefun {char *} jit_strchr (const char *@var{str}, int @var{ch})
- * Search @var{str} for the first occurrence of @var{ch}.  Returns
- * the address where @var{ch} was found, or NULL if not found.
- * @end deftypefun
-@*/
-char *jit_strchr(const char *str, int ch)
-{
-#ifdef HAVE_STRCHR
-       return strchr(str, ch);
-#else
-       char *s = (char *)str;
-       for(;;)
-       {
-               if(*s == (char)ch)
-               {
-                       return s;
-               }
-               else if(*s == '\0')
-               {
-                       break;
-               }
-               ++s;
-       }
-       return 0;
-#endif
-}
-
-/*@
- * @deftypefun {char *} jit_strrchr (const char *@var{str}, int @var{ch})
- * Search @var{str} for the first occurrence of @var{ch}, starting
- * at the end of the string.  Returns the address where @var{ch}
- * was found, or NULL if not found.
- * @end deftypefun
-@*/
-char *jit_strrchr(const char *str, int ch)
-{
-#ifdef HAVE_STRRCHR
-       return strrchr(str, ch);
-#else
-       unsigned int len = jit_strlen(str);
-       char *s = (char *)(str + len);
-       while(len > 0)
-       {
-               --s;
-               if(*s == (char)ch)
-               {
-                       return s;
-               }
-               --len;
-       }
-       return 0;
-#endif
-}
-
-int jit_sprintf(char *str, const char *format, ...)
-{
-       va_list va;
-       int result;
-#ifdef HAVE_STDARG_H
-       va_start(va, format);
-#else
-       va_start(va);
-#endif
-#ifdef VSPRINTF
-       result = vsprintf(str, format, va);
-#else
-       *str = '\0';
-       result = 0;
-#endif
-       va_end(va);
-       return result;
-}
-
-int jit_snprintf(char *str, unsigned int len, const char *format, ...)
-{
-       va_list va;
-       int result;
-#ifdef HAVE_STDARG_H
-       va_start(va, format);
-#else
-       va_start(va);
-#endif
-#if defined(HAVE_VSNPRINTF)
-       result = vsnprintf(str, len, format, va);
-#elif defined(HAVE__VSNPRINTF)
-       result = _vsnprintf(str, len, format, va);
-#else
-       *str = '\0';
-       result = 0;
-#endif
-       va_end(va);
-       return result;
-}
index 662ea2bcfb5928c0a06165f191b132b9e3004b1e..9f2ec0c716f1507959a72074a7a7e71abef22226 100644 (file)
  * <http://www.gnu.org/licenses/>.
  */
 
-#include "jit-internal.h"
+#include <jit/jit-util.h>
+#include "jit-config.h"
+
+#include <stdio.h>
+#if defined(HAVE_STRING_H)
+# include <string.h>
+#elif defined(HAVE_STRINGS_H)
+# include <strings.h>
+#endif
+#if defined(HAVE_MEMORY_H)
+# include <memory.h>
+#endif
+#if defined(HAVE_STDARG_H)
+# include <stdarg.h>
+#elif defined(HAVE_VARARGS_H)
+# include <varargs.h>
+#endif
 
 /*
  * Undefine the macros in "jit-internal.h" so that we
@@ -178,3 +194,369 @@ void *jit_memchr(const void *str, int ch, unsigned int len)
        return (void *)0;
 #endif
 }
+
+/*@
+ * @section String operations
+ * @cindex String operations
+ *
+ * The following functions are provided to manipulate NULL-terminated
+ * strings.  It is highly recommended that you use these functions in
+ * preference to system functions, because the corresponding system
+ * functions are extremely non-portable.
+@*/
+
+/*@
+ * @deftypefun {unsigned int} jit_strlen (const char *@var{str})
+ * Returns the length of @var{str}.
+ * @end deftypefun
+@*/
+unsigned int jit_strlen(const char *str)
+{
+#ifdef HAVE_STRLEN
+       return (unsigned int)(strlen(str));
+#else
+       unsigned int len = 0;
+       while(*str++ != '\0')
+       {
+               ++len;
+       }
+       return len;
+#endif
+}
+
+/*@
+ * @deftypefun {char *} jit_strcpy (char *@var{dest}, const char *@var{src})
+ * Copy the string at @var{src} to @var{dest}.  Returns @var{dest}.
+ * @end deftypefun
+@*/
+char *jit_strcpy(char *dest, const char *src)
+{
+#ifdef HAVE_STRCPY
+       return strcpy(dest, src);
+#else
+       char ch;
+       char *d = dest;
+       while((ch = *src++) != '\0')
+       {
+               *d++ = ch;
+       }
+       *d = '\0';
+       return dest;
+#endif
+}
+
+/*@
+ * @deftypefun {char *} jit_strcat (char *@var{dest}, const char *@var{src})
+ * Copy the string at @var{src} to the end of the string at @var{dest}.
+ * Returns @var{dest}.
+ * @end deftypefun
+@*/
+char *jit_strcat(char *dest, const char *src)
+{
+#ifdef HAVE_STRCAT
+       return strcat(dest, src);
+#else
+       char ch;
+       char *d = dest + jit_strlen(dest);
+       while((ch = *src++) != '\0')
+       {
+               *d++ = ch;
+       }
+       *d = '\0';
+       return dest;
+#endif
+}
+
+/*@
+ * @deftypefun {char *} jit_strncpy (char *@var{dest}, const char *@var{src}, unsigned int @var{len})
+ * Copy at most @var{len} characters from the string at @var{src} to
+ * @var{dest}.  Returns @var{dest}.
+ * @end deftypefun
+@*/
+char *jit_strncpy(char *dest, const char *src, unsigned int len)
+{
+#ifdef HAVE_STRNCPY
+       return strncpy(dest, src, len);
+#else
+       char ch;
+       char *d = dest;
+       while(len > 0 && (ch = *src++) != '\0')
+       {
+               *d++ = ch;
+               --len;
+       }
+       while(len > 0)
+       {
+               *d++ = '\0';
+               --len;
+       }
+       return dest;
+#endif
+}
+
+/*@
+ * @deftypefun {char *} jit_strdup (const char *@var{str})
+ * Allocate a block of memory using @code{jit_malloc} and copy
+ * @var{str} into it.  Returns NULL if @var{str} is NULL or there
+ * is insufficient memory to perform the @code{jit_malloc} operation.
+ * @end deftypefun
+@*/
+char *jit_strdup(const char *str)
+{
+       char *new_str;
+       if(!str)
+       {
+               return 0;
+       }
+       new_str = jit_malloc(strlen(str) + 1);
+       if(!new_str)
+       {
+               return 0;
+       }
+       strcpy(new_str, str);
+       return new_str;
+}
+
+/*@
+ * @deftypefun {char *} jit_strndup (const char *@var{str}, unsigned int @var{len})
+ * Allocate a block of memory using @code{jit_malloc} and copy at most
+ * @var{len} characters of @var{str} into it.  The copied string is then
+ * NULL-terminated.  Returns NULL if @var{str} is NULL or there
+ * is insufficient memory to perform the @code{jit_malloc} operation.
+ * @end deftypefun
+@*/
+char *jit_strndup(const char *str, unsigned int len)
+{
+       char *new_str;
+       if(!str)
+       {
+               return 0;
+       }
+       new_str = jit_malloc(len + 1);
+       if(!new_str)
+       {
+               return 0;
+       }
+       jit_memcpy(new_str, str, len);
+       new_str[len] = '\0';
+       return new_str;
+}
+
+/*@
+ * @deftypefun int jit_strcmp (const char *@var{str1}, const char *@var{str2})
+ * Compare the two strings @var{str1} and @var{str2}, returning
+ * a negative, zero, or positive value depending upon their relationship.
+ * @end deftypefun
+@*/
+int jit_strcmp(const char *str1, const char *str2)
+{
+#ifdef HAVE_STRCMP
+       return strcmp(str1, str2);
+#else
+       int ch1, ch2;
+       for(;;)
+       {
+               ch1 = *str1++;
+               ch2 = *str2++;
+               if(ch1 != ch2 || !ch1 || !ch2)
+               {
+                       break;
+               }
+       }
+       return (ch1 - ch2);
+#endif
+}
+
+/*@
+ * @deftypefun int jit_strncmp (const char *@var{str1}, const char *@var{str2}, unsigned int @var{len})
+ * Compare the two strings @var{str1} and @var{str2}, returning
+ * a negative, zero, or positive value depending upon their relationship.
+ * At most @var{len} characters are compared.
+ * @end deftypefun
+@*/
+int jit_strncmp(const char *str1, const char *str2, unsigned int len)
+{
+#ifdef HAVE_STRNCMP
+       return strncmp(str1, str2, len);
+#else
+       int ch1, ch2;
+       while(len > 0)
+       {
+               ch1 = *str1++;
+               ch2 = *str2++;
+               if(ch1 != ch2 || !ch1 || !ch2)
+               {
+                       return (ch1 - ch2);
+               }
+               --len;
+       }
+       return 0;
+#endif
+}
+
+/*@
+ * @deftypefun int jit_stricmp (const char *@var{str1}, const char *@var{str2})
+ * Compare the two strings @var{str1} and @var{str2}, returning
+ * a negative, zero, or positive value depending upon their relationship.
+ * Instances of the English letters A to Z are converted into their
+ * lower case counterparts before comparison.
+ *
+ * Note: this function is guaranteed to use English case comparison rules,
+ * no matter what the current locale is set to, making it suitable for
+ * comparing token tags and simple programming language identifiers.
+ *
+ * Locale-sensitive string comparison is complicated and usually specific
+ * to the front end language or its supporting runtime library.  We
+ * deliberately chose not to handle this in @code{libjit}.
+ * @end deftypefun
+@*/
+int jit_stricmp(const char *str1, const char *str2)
+{
+       int ch1, ch2;
+       for(;;)
+       {
+               ch1 = *str1++;
+               ch2 = *str2++;
+               if(ch1 >= 'A' && ch1 <= 'Z')
+               {
+                       ch1 = ch1 - 'A' + 'a';
+               }
+               if(ch2 >= 'A' && ch2 <= 'Z')
+               {
+                       ch2 = ch2 - 'A' + 'a';
+               }
+               if(ch1 != ch2 || !ch1 || !ch2)
+               {
+                       break;
+               }
+       }
+       return (ch1 - ch2);
+}
+
+/*@
+ * @deftypefun int jit_strnicmp (const char *@var{str1}, const char *@var{str2}, unsigned int @var{len})
+ * Compare the two strings @var{str1} and @var{str2}, returning
+ * a negative, zero, or positive value depending upon their relationship.
+ * At most @var{len} characters are compared.  Instances of the English
+ * letters A to Z are converted into their lower case counterparts
+ * before comparison.
+ * @end deftypefun
+@*/
+int jit_strnicmp(const char *str1, const char *str2, unsigned int len)
+{
+       int ch1, ch2;
+       while(len > 0)
+       {
+               ch1 = *str1++;
+               ch2 = *str2++;
+               if(ch1 >= 'A' && ch1 <= 'Z')
+               {
+                       ch1 = ch1 - 'A' + 'a';
+               }
+               if(ch2 >= 'A' && ch2 <= 'Z')
+               {
+                       ch2 = ch2 - 'A' + 'a';
+               }
+               if(ch1 != ch2 || !ch1 || !ch2)
+               {
+                       return (ch1 - ch2);
+               }
+               --len;
+       }
+       return 0;
+}
+
+/*@
+ * @deftypefun {char *} jit_strchr (const char *@var{str}, int @var{ch})
+ * Search @var{str} for the first occurrence of @var{ch}.  Returns
+ * the address where @var{ch} was found, or NULL if not found.
+ * @end deftypefun
+@*/
+char *jit_strchr(const char *str, int ch)
+{
+#ifdef HAVE_STRCHR
+       return strchr(str, ch);
+#else
+       char *s = (char *)str;
+       for(;;)
+       {
+               if(*s == (char)ch)
+               {
+                       return s;
+               }
+               else if(*s == '\0')
+               {
+                       break;
+               }
+               ++s;
+       }
+       return 0;
+#endif
+}
+
+/*@
+ * @deftypefun {char *} jit_strrchr (const char *@var{str}, int @var{ch})
+ * Search @var{str} for the first occurrence of @var{ch}, starting
+ * at the end of the string.  Returns the address where @var{ch}
+ * was found, or NULL if not found.
+ * @end deftypefun
+@*/
+char *jit_strrchr(const char *str, int ch)
+{
+#ifdef HAVE_STRRCHR
+       return strrchr(str, ch);
+#else
+       unsigned int len = jit_strlen(str);
+       char *s = (char *)(str + len);
+       while(len > 0)
+       {
+               --s;
+               if(*s == (char)ch)
+               {
+                       return s;
+               }
+               --len;
+       }
+       return 0;
+#endif
+}
+
+int jit_sprintf(char *str, const char *format, ...)
+{
+       va_list va;
+       int result;
+#ifdef HAVE_STDARG_H
+       va_start(va, format);
+#else
+       va_start(va);
+#endif
+#ifdef VSPRINTF
+       result = vsprintf(str, format, va);
+#else
+       *str = '\0';
+       result = 0;
+#endif
+       va_end(va);
+       return result;
+}
+
+int jit_snprintf(char *str, unsigned int len, const char *format, ...)
+{
+       va_list va;
+       int result;
+#ifdef HAVE_STDARG_H
+       va_start(va, format);
+#else
+       va_start(va);
+#endif
+#if defined(HAVE_VSNPRINTF)
+       result = vsnprintf(str, len, format, va);
+#elif defined(HAVE__VSNPRINTF)
+       result = _vsnprintf(str, len, format, va);
+#else
+       *str = '\0';
+       result = 0;
+#endif
+       va_end(va);
+       return result;
+}