]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2005-05-08 Vincent Pelletier <subdino2004@yahoo.fr>
authorhollisb <hollisb@localhost>
Mon, 9 May 2005 01:47:37 +0000 (01:47 +0000)
committerhollisb <hollisb@localhost>
Mon, 9 May 2005 01:47:37 +0000 (01:47 +0000)
* include/grub/misc.h (grub_dprintf): New macro.
(grub_real_dprintf): New prototype.
(grub_strword): Likewise.
(grub_iswordseparator): Likewise.
* kern/misc.c (grub_real_dprintf): New function.
(grub_strword): Likewise.
(grub_iswordseparator): Likewise.

ChangeLog
include/grub/misc.h
kern/misc.c

index 9a6ff31185a7ffe993a5886e843535d4fab0409d..7c68b76939260fe243ff1d4884f0988d3f01bb71 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2005-05-08  Vincent Pelletier  <subdino2004@yahoo.fr>
+
+       * include/grub/misc.h (grub_dprintf): New macro.
+       (grub_real_dprintf): New prototype.
+       (grub_strword): Likewise.
+       (grub_iswordseparator): Likewise.
+       * kern/misc.c (grub_real_dprintf): New function.
+       (grub_strword): Likewise.
+       (grub_iswordseparator): Likewise.
+
 2005-04-30  Hollis Blanchard  <hollis@penguinppc.org>
 
        * boot/powerpc/ieee1275/cmain.c: Don't include grub/machine/init.h.
index 00bc7d5f9eaefdbc5399a46b3a82f8d75a0a73df..94f2bfa985353e61e9c7b60d212bab2478fbb5cf 100644 (file)
@@ -26,6 +26,7 @@
 #include <grub/symbol.h>
 #include <grub/err.h>
 
+#define grub_dprintf(condition, fmt, args...) grub_real_dprintf(__FILE__, __LINE__, condition, fmt, ## args);
 /* XXX: If grub_memmove is too slow, we must implement grub_memcpy.  */
 #define grub_memcpy(d,s,n)     grub_memmove ((d), (s), (n))
 
@@ -46,6 +47,8 @@ int EXPORT_FUNC(grub_strncmp) (const char *s1, const char *s2, int c);
 int EXPORT_FUNC(grub_strncasecmp) (const char *s1, const char *s2, int c);
 char *EXPORT_FUNC(grub_strchr) (const char *s, int c);
 char *EXPORT_FUNC(grub_strrchr) (const char *s, int c);
+int EXPORT_FUNC(grub_strword) (const char *s, const char *w);
+int EXPORT_FUNC(grub_iswordseparator) (int c);
 int EXPORT_FUNC(grub_isspace) (int c);
 int EXPORT_FUNC(grub_isprint) (int c);
 int EXPORT_FUNC(grub_isalpha) (int c);
@@ -58,6 +61,10 @@ char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n);
 void *EXPORT_FUNC(grub_memset) (void *s, int c, grub_size_t n);
 grub_size_t EXPORT_FUNC(grub_strlen) (const char *s);
 int EXPORT_FUNC(grub_printf) (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
+void EXPORT_FUNC(grub_real_dprintf) (const char *file,
+                                     const int line,
+                                     const char *condition,
+                                     const char *fmt, ...) __attribute__ ((format (printf, 4, 5)));
 int EXPORT_FUNC(grub_vprintf) (const char *fmt, va_list args);
 int EXPORT_FUNC(grub_sprintf) (char *str, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
 int EXPORT_FUNC(grub_vsprintf) (char *str, const char *fmt, va_list args);
index da809ff5c99ea9428fdcc1496bd29583813a49d8..524f8cdb444e9739ebe9546f447fc650dddb054a 100644 (file)
@@ -128,6 +128,23 @@ grub_printf (const char *fmt, ...)
   return ret;
 }  
 
+void
+grub_real_dprintf(const char *file, const int line, const char *condition,
+                  const char *fmt, ...)
+{
+  va_list args;
+  const char *debug = grub_env_get ("debug");
+  if (! debug)
+    return;
+  if (grub_strword (debug, "all") || grub_strword (debug, condition))
+    {
+      grub_printf ("%s,%d : ", file, line);
+      va_start (args, fmt);
+      grub_vprintf (fmt, args);
+      va_end (args);
+    }
+}
+
 int
 grub_vprintf (const char *fmt, va_list args)
 {
@@ -237,6 +254,49 @@ grub_strrchr (const char *s, int c)
   return p;
 }
 
+int
+grub_strword (const char *haystack, const char *needle)
+{
+  const char *n_pos = needle;
+
+  while (grub_iswordseparator (*haystack))
+    haystack++;
+
+  while (*haystack)
+    {
+      /* Crawl both the needle and the haystack word we're on.  */
+      while(*haystack && !grub_iswordseparator (*haystack)
+            && *haystack == *n_pos)
+        {
+          haystack++;
+          n_pos++;
+        }
+
+      /* If we reached the end of both words at the same time, the word
+      is found. If not, eat everything in the haystack that isn't the
+      next word (or the end of string) and "reset" the needle.  */
+      if ( (!*haystack || grub_iswordseparator (*haystack))
+         && (!*n_pos || grub_iswordseparator (*n_pos)))
+        return 1;
+      else
+        {
+          n_pos = needle;
+          while (*haystack && !grub_iswordseparator (*haystack))
+            haystack++;
+          while (grub_iswordseparator (*haystack))
+            haystack++;
+        }
+    }
+
+  return 0;
+}
+
+int
+grub_iswordseparator (int c)
+{
+  return (grub_isspace (c) || c == ',' || c == ';' || c == '|' || c == '&');
+}
+
 int
 grub_isspace (int c)
 {