diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html
index a85a5c2f7..919ae5891 100644
--- a/documentation/RELEASE_NOTES.html
+++ b/documentation/RELEASE_NOTES.html
@@ -16,6 +16,9 @@
Changes since 3.14.4
+New epicsString.h function
+A new function epicsStrnCaseCmp has been added. It is like strncmp except
+that it ignores case.
R3.13 compatability files
diff --git a/src/libCom/misc/epicsString.c b/src/libCom/misc/epicsString.c
index 728dbdb06..69250bec0 100644
--- a/src/libCom/misc/epicsString.c
+++ b/src/libCom/misc/epicsString.c
@@ -88,6 +88,22 @@ epicsShareFunc int epicsShareAPI dbTranslateEscape(char *to, const char *from)
}
epicsShareFunc int epicsShareAPI epicsStrCaseCmp(
+ const char *s1, const char *s2)
+{
+ int nexts1,nexts2;
+
+ while(1) {
+ nexts1 = toupper(*s1++);
+ nexts2 = toupper(*s2++);
+ if(nexts1==0) return( (nexts2==0) ? 0 : 1 );
+ if(nexts2==0) return(-1);
+ if(nexts1nexts2) return(1);
+ }
+ return(0);
+}
+
+epicsShareFunc int epicsShareAPI epicsStrnCaseCmp(
const char *s1, const char *s2, int n)
{
size_t ind = 0;
diff --git a/src/libCom/misc/epicsString.h b/src/libCom/misc/epicsString.h
index 775b23532..d4bd54eee 100644
--- a/src/libCom/misc/epicsString.h
+++ b/src/libCom/misc/epicsString.h
@@ -23,8 +23,8 @@ extern "C" {
#endif
epicsShareFunc int epicsShareAPI dbTranslateEscape(char *s,const char *ct);
-epicsShareFunc int epicsShareAPI epicsStrCaseCmp(
- const char *s1, const char *s2, int n);
+epicsShareFunc int epicsShareAPI epicsStrCaseCmp(const char *s1,const char *s2);
+epicsShareFunc int epicsShareAPI epicsStrnCaseCmp(const char *s1,const char *s2, int n);
epicsShareFunc char * epicsShareAPI epicsStrDup(const char *s);
epicsShareFunc int epicsShareAPI epicsStrPrintEscaped(
FILE *fp, const char *s, int n);
diff --git a/src/libCom/test/epicsStringTest.c b/src/libCom/test/epicsStringTest.c
index 17a96851e..17066a6f2 100644
--- a/src/libCom/test/epicsStringTest.c
+++ b/src/libCom/test/epicsStringTest.c
@@ -23,20 +23,28 @@
int epicsStringTest()
{
- if(epicsStrCaseCmp("","",0)!=0) printf("case 1 failed\n");
- if(epicsStrCaseCmp("","",1)!=0) printf("case 2 failed\n");
- if(epicsStrCaseCmp(" ","",1)!=-1) printf("case 3 failed\n");
- if(epicsStrCaseCmp(""," ",1)!=1) printf("case 4 failed\n");
- if(epicsStrCaseCmp("a","A",1)!=0) printf("case 5 failed\n");
- if(epicsStrCaseCmp("a","A",2)!=0) printf("case 6 failed\n");
- if(epicsStrCaseCmp("abcd","ABCD",2)!=0) printf("case 7 failed\n");
- if(epicsStrCaseCmp("abcd","ABCD",4)!=0) printf("case 8 failed\n");
- if(epicsStrCaseCmp("abcd","ABCD",1000)!=0) printf("case 9 failed\n");
- if(epicsStrCaseCmp("abcd","ABCDE",2)!=0) printf("case 10 failed\n");
- if(epicsStrCaseCmp("abcd","ABCDE",4)!=0) printf("case 11 failed\n");
- if(epicsStrCaseCmp("abcd","ABCDE",1000)!=1) printf("case 12 failed\n");
- if(epicsStrCaseCmp("abcde","ABCD",2)!=0) printf("case 13 failed\n");
- if(epicsStrCaseCmp("abcde","ABCD",4)!=0) printf("case 14 failed\n");
- if(epicsStrCaseCmp("abcde","ABCD",1000)!=-1) printf("case 15 failed\n");
+ if(epicsStrnCaseCmp("","",0)!=0) printf("case 1 failed\n");
+ if(epicsStrnCaseCmp("","",1)!=0) printf("case 2 failed\n");
+ if(epicsStrnCaseCmp(" ","",1)!=-1) printf("case 3 failed\n");
+ if(epicsStrnCaseCmp(""," ",1)!=1) printf("case 4 failed\n");
+ if(epicsStrnCaseCmp("a","A",1)!=0) printf("case 5 failed\n");
+ if(epicsStrnCaseCmp("a","A",2)!=0) printf("case 6 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCD",2)!=0) printf("case 7 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCD",4)!=0) printf("case 8 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCD",1000)!=0) printf("case 9 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCDE",2)!=0) printf("case 10 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCDE",4)!=0) printf("case 11 failed\n");
+ if(epicsStrnCaseCmp("abcd","ABCDE",1000)!=1) printf("case 12 failed\n");
+ if(epicsStrnCaseCmp("abcde","ABCD",2)!=0) printf("case 13 failed\n");
+ if(epicsStrnCaseCmp("abcde","ABCD",4)!=0) printf("case 14 failed\n");
+ if(epicsStrnCaseCmp("abcde","ABCD",1000)!=-1) printf("case 15 failed\n");
+
+ if(epicsStrCaseCmp("","")!=0) printf("case 16 failed\n");
+ if(epicsStrCaseCmp("a","A")!=0) printf("case 17 failed\n");
+ if(epicsStrCaseCmp("abcd","ABCD")!=0) printf("case 18 failed\n");
+ if(epicsStrCaseCmp("abcd","ABCDE")==0) printf("case 19 failed\n");
+ if(epicsStrCaseCmp("abcde","ABCD")==0) printf("case 20 failed\n");
+ if(epicsStrCaseCmp("abcde","ABCDF")==0) printf("case 21 failed\n");
+
return(0);
}