summaryrefslogtreecommitdiff
path: root/libc/msdos/i86.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/msdos/i86.c')
-rw-r--r--libc/msdos/i86.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/libc/msdos/i86.c b/libc/msdos/i86.c
index 44de3e3..6c613b2 100644
--- a/libc/msdos/i86.c
+++ b/libc/msdos/i86.c
@@ -173,20 +173,48 @@ got_it:
}
#endif
-#ifdef L___strchr_es
+#ifdef L___strnget_es
char *
__strnget_es(d, s, c)
-char *d, *s;
-int c;
+char *d;
+char *s;
+register int c;
{
- int ds, es;
- char *p = __strchr_es(s, '\0');
- if(p != 0 && p-s < c)
- c = p-s+1;
- ds = __get_ds();
- es = __get_es();
-
- __movedata(es, s, ds, d, c);
+ register int i = __strlen_es(s);
+ if(i < c) c = i+1;
+ /* else s[--c] = 0; ?? */
+ /* else return -E2BIG; ?? */
+
+ __movedata(__get_es(), s, __get_ds(), d, c);
+}
+#endif
+
+#ifdef L___strlen_es
+int __strlen_es(str)
+char * str;
+{
+#asm
+#if !__FIRST_ARG_IN_AX__
+ mov bx,sp
+#endif
+ push di
+ cld
+
+#if __FIRST_ARG_IN_AX__
+ mov di,ax
+#else
+ mov di,[bx+2]
+#endif
+ mov cx,#-1
+ xor ax,ax
+ repne
+ scasb ! Scans [ES:DI]
+ not cx
+ dec cx
+ mov ax,cx
+
+ pop di
+#endasm
}
#endif