summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/ppc/stricmpp.s
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/ppc/stricmpp.s')
-rw-r--r--private/crt32/string/ppc/stricmpp.s89
1 files changed, 89 insertions, 0 deletions
diff --git a/private/crt32/string/ppc/stricmpp.s b/private/crt32/string/ppc/stricmpp.s
new file mode 100644
index 000000000..a61d23573
--- /dev/null
+++ b/private/crt32/string/ppc/stricmpp.s
@@ -0,0 +1,89 @@
+// TITLE("_stricmp _strcmpi")
+//++
+//
+// Copyright (c) 1994 IBM Corporation
+//
+// Module Name:
+//
+// _stricmp.s
+// _strcmpi.s
+//
+// Routine Description:
+//
+// The functions are synomns. The functions return an integer
+// indicating case-insensitive string comparision, as the function
+// maps characters from upper to lower case. Note that the
+// mapping from upper to lower affects outcome when comparison
+// strings contain characters 91-96 as compared
+// to mapping lower to upper.
+//
+// Author:
+//
+// Jeff Simon (jhs) 02-Aug-1994
+//
+// Environment:
+//
+// User or Kernel mode.
+//
+// Revision History:
+//
+// Includes
+
+#include <kxppc.h>
+
+// int _stricmp _strcmpi
+// (
+// char *str1,
+// char *str2
+// )
+//
+// Arguments:
+//
+// STR1 (r.3) - A pointer to the first string
+//
+// STR2 (r.4) - A pointer to the second string
+//
+//
+// Return Value:
+//
+// < 0 if STR1 < STR2
+// = 0 if STR1 = STR2
+// > 0 if STR1 > STR2
+//
+//
+
+ LEAF_ENTRY(_stricmp)
+ ALTERNATE_ENTRY(_strcmpi)
+
+ addi r9,r3,-1 # copy ptr
+ addi r4,r4,-1
+Loop1:
+
+ lbzu r6,1(r4) # read char
+ lbzu r5,1(r9) # read char
+ cmpi 0x7,0x0,r6,0 # Is char null?
+ subf. r3,r6,r5 # Calc result
+
+ bc 0xc,0x1e,Loop20 # b if !=
+ bc 0xc,0x2,Loop1 # b if r5 ?= r6
+
+Loop4:
+ cmpi 0x5,0x0,r6,0x41 # Is r5 > 60
+ cmpi 0x6,0x0,r6,0x5A # Is r6 < 7B
+ blt 0x5,Loop2 # ? >
+ bgt 0x6,Loop2 # ? <
+
+ ori r6,r6,0x20 # cvrt to lower case
+Loop2:
+ cmpi 0x0,0x0,r5,0x41 # Is r5 > 60
+ cmpi 0x1,0x0,r5,0x5A # Is r6 < 7B
+ blt 0x0,Loop3 # ?
+ bgt 0x1,Loop3 # ?
+
+ ori r5,r5,0x20 # cvrt to lower case
+Loop3:
+ subf. r3,r6,r5 # Is r6 = r5
+ beq Loop1 # !=, done
+
+Loop20:
+ LEAF_EXIT(_stricmp)