Imported Upstream version 0.1beta
[debian/yforth] / string.c
1 /* yForth? - Written by Luca Padovani (C) 1996/97
2  * ------------------------------------------------------------------------
3  * This software is FreeWare as long as it comes with this header in each
4  * source file, anyway you can use it or any part of it whatever
5  * you want. It comes without any warranty, so use it at your own risk.
6  * ------------------------------------------------------------------------
7  * Module name:
8  * Abstract:
9  */
10
11 #include <string.h>
12 #include <ctype.h>
13 #include "yforth.h"
14 #include "string.h"
15 #include "core.h"
16
17 /**************************************************************************/
18 /* WORDS ******************************************************************/
19 /**************************************************************************/
20
21 void _dash_trailing() {
22         register Char *s = (Char *) sp[1];
23         register int i = sp[0];
24         while (i-- > 0) if (!isspace(s[i])) break;
25         sp[0] = i + 1;
26 }
27
28 void _slash_string() {
29         register Cell n = *sp++;
30         sp[1] = (Cell) ((Char *) sp[1] + n);
31         sp[0] -= n;
32 }
33
34 void _blank() {
35         register UCell u = (UCell) *sp++;
36         register Char *s = (Char *) *sp++;
37         if (u) memset(s, ' ', u);
38 }
39
40 void _c_move() {
41         register UCell u = (UCell) *sp++;
42         register Char *dest = (Char *) *sp++;
43         register Char *source = (Char *) *sp++;
44         while (u--) *dest++ = *source++;
45 }
46
47 void _c_move_up() {
48         register UCell u = (UCell) *sp++;
49         register Char *dest = (Char *) *sp++ + u;
50         register Char *source = (Char *) *sp++ + u;
51         while (u--) *--dest = *--source;
52 }
53
54 void _compare() {
55         register UCell u2 = (UCell) *sp++;
56         register Char *s2 = (Char *) *sp++;
57         register UCell u1 = (UCell) *sp++;
58         register Char *s1 = (Char *) *sp;
59         register UCell m = u2 <= u1 ? u2 : u1;
60         while (m) {
61                 if (*s1 != *s2) break;
62                 s1++;
63                 s2++;
64                 m--;
65         }
66         if (u1 == u2 && !m) *sp = 0;
67         else if (!m) *sp = u1 < u2 ? -1 : 1;
68         else *sp = *s1 < *s2 ? -1 : 1;
69 }
70
71 void _search() {
72         register UCell u2 = (UCell) *sp++;
73         register Char *s2 = (Char *) sp[0];
74         register UCell u1 = (UCell) sp[1];
75         register Char *s1 = (Char *) sp[2];
76         if (u2 > u1) *sp = FFLAG(0);
77         else {
78                 while (u1 >= u2) {
79                         *--sp = (Cell) s1;
80                         *--sp = (Cell) u1;
81                         *--sp = (Cell) s2;
82                         *--sp = (Cell) u2;
83                         _compare();
84                         if (!(*sp++)) {
85                                 sp[2] = (Cell) s1;
86                                 sp[1] = (Cell) u1;
87                                 sp[0] = FFLAG(1);
88                                 break;
89                         } else {
90                                 s1++;
91                                 u1--;
92                         }
93                 }
94         }
95 }
96
97 void _s_literal() {
98         register UCell u = (UCell) *sp++;
99         register Char *s = (Char *) *sp++;
100         compile_cell((Cell) _do_literal);
101         compile_cell((Cell) s);
102         compile_cell((Cell) _do_literal);
103         compile_cell((Cell) u);
104 }
105