From ccf592bf71bf28d4038a5ba2dc60b59a550a1e86 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Wed, 19 Mar 2003 23:06:01 +0000
Subject: [PATCH] Support case insensitive parsing of the slurm configuration
 file.

---
 src/common/parse_spec.c | 42 ++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/src/common/parse_spec.c b/src/common/parse_spec.c
index 5160f61ce9e..eb855a96670 100644
--- a/src/common/parse_spec.c
+++ b/src/common/parse_spec.c
@@ -43,14 +43,15 @@
 #define BUF_SIZE 1024
 #define SEPCHARS " \n\t"
 
-static int  _load_long (long *destination, char *keyword, char *in_line) ;
-static int  _load_integer (int *destination, char *keyword, char *in_line) ;
-static int  _load_float (float *destination, char *keyword, char *in_line) ;
-static void _remove_quotes (char **destination) ;
+static int   _load_long (long *destination, char *keyword, char *in_line) ;
+static int   _load_integer (int *destination, char *keyword, char *in_line) ;
+static int   _load_float (float *destination, char *keyword, char *in_line) ;
+static void  _remove_quotes (char **destination) ;
+static char *_strcasestr(char *haystack, char *needle);
 
 /* 
  * slurm_parser - parse the supplied specification into keyword/value pairs
- *	only the keywords supplied will be searched for. the supplied 
+ *	only the keywords supplied will be searched for. The supplied 
  *	specification is altered, overwriting the keyword and value pairs 
  *	with spaces.
  * spec - pointer to the string of specifications, sets of three values 
@@ -123,7 +124,7 @@ _load_float (float *destination, char *keyword, char *in_line)
 	char *str_ptr1, *str_ptr2, *str_ptr3;
 	int i, str_len1, str_len2;
 
-	str_ptr1 = (char *) strstr (in_line, keyword);
+	str_ptr1 = (char *) _strcasestr (in_line, keyword);
 	if (str_ptr1 != NULL) {
 		str_len1 = strlen (keyword);
 		strcpy (scratch, str_ptr1 + str_len1);
@@ -161,7 +162,7 @@ _load_integer (int *destination, char *keyword, char *in_line)
 	char *str_ptr1, *str_ptr2, *str_ptr3;
 	int i, str_len1, str_len2;
 
-	str_ptr1 = (char *) strstr (in_line, keyword);
+	str_ptr1 = (char *) _strcasestr (in_line, keyword);
 	if (str_ptr1 != NULL) {
 		str_len1 = strlen (keyword);
 		strcpy (scratch, str_ptr1 + str_len1);
@@ -218,7 +219,7 @@ _load_long (long *destination, char *keyword, char *in_line)
 	char *str_ptr1, *str_ptr2, *str_ptr3;
 	int i, str_len1, str_len2;
 
-	str_ptr1 = (char *) strstr (in_line, keyword);
+	str_ptr1 = (char *) _strcasestr (in_line, keyword);
 	if (str_ptr1 != NULL) {
 		str_len1 = strlen (keyword);
 		strcpy (scratch, str_ptr1 + str_len1);
@@ -275,7 +276,7 @@ load_string  (char **destination, char *keyword, char *in_line)
 	char *str_ptr1, *str_ptr2, *str_ptr3;
 	int i, str_len1, str_len2;
 
-	str_ptr1 = (char *) strstr (in_line, keyword);
+	str_ptr1 = (char *) _strcasestr (in_line, keyword);
 	if (str_ptr1 != NULL) {
 		str_len1 = strlen (keyword);
 		strcpy (scratch, str_ptr1 + str_len1);
@@ -316,3 +317,26 @@ _remove_quotes (char **destination)
 	}
 }
 
+/* case insensitve version of strstr() */
+static char *
+_strcasestr(char *haystack, char *needle)
+{
+	int hay_inx,  hay_size  = strlen(haystack);
+	int need_inx, need_size = strlen(needle);
+	char *hay_ptr = haystack;
+
+	for (hay_inx=0; hay_inx<hay_size; hay_inx++) {
+		for (need_inx=0; need_inx<need_size; need_inx++) {
+			if (tolower((int) hay_ptr[need_inx]) != 
+			    tolower((int) needle [need_inx]))
+				break;		/* mis-match */
+		}
+
+		if (need_inx == need_size)	/* it matched */
+			return hay_ptr;
+		else				/* keep looking */
+			hay_ptr++;
+	}
+
+	return NULL;	/* no match anywhere in string */
+}
-- 
GitLab