1 /* $Header: /src/pub/tcsh/sh.set.c,v 3.44 2002/07/01 20:50:22 christos Exp $ */
3 * sh.set.c: Setting and Clearing of variables
6 * Copyright (c) 1980, 1991 The Regents of the University of California.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 RCSID("$Id: sh.set.c,v 3.44 2002/07/01 20:50:22 christos Exp $")
41 extern bool GotTermCaps
;
43 static void update_vars
__P((Char
*));
44 static Char
*getinx
__P((Char
*, int *));
45 static void asx
__P((Char
*, int, Char
*));
46 static struct varent
*getvx
__P((Char
*, int));
47 static Char
*xset
__P((Char
*, Char
***));
48 static Char
*operate
__P((int, Char
*, Char
*));
49 static void putn1
__P((int));
50 static struct varent
*madrof
__P((Char
*, struct varent
*));
51 static void unsetv1
__P((struct varent
*));
52 static void exportpath
__P((Char
**));
53 static void balance
__P((struct varent
*, int, int));
63 if (eq(vp
, STRpath
)) {
64 exportpath(adrof(STRpath
)->vec
);
67 else if (eq(vp
, STRhistchars
)) {
68 register Char
*pn
= varval(vp
);
73 else if (eq(vp
, STRpromptchars
)) {
74 register Char
*pn
= varval(vp
);
79 else if (eq(vp
, STRhistlit
)) {
82 else if (eq(vp
, STRuser
)) {
83 tsetenv(STRKUSER
, varval(vp
));
84 tsetenv(STRLOGNAME
, varval(vp
));
86 else if (eq(vp
, STRgroup
)) {
87 tsetenv(STRKGROUP
, varval(vp
));
89 else if (eq(vp
, STRwordchars
)) {
90 word_chars
= varval(vp
);
92 else if (eq(vp
, STRloginsh
)) {
95 else if (eq(vp
, STRsymlinks
)) {
96 register Char
*pn
= varval(vp
);
98 if (eq(pn
, STRignore
))
99 symlinks
= SYM_IGNORE
;
100 else if (eq(pn
, STRexpand
))
101 symlinks
= SYM_EXPAND
;
102 else if (eq(pn
, STRchase
))
103 symlinks
= SYM_CHASE
;
107 else if (eq(vp
, STRterm
)) {
108 Char
*cp
= varval(vp
);
109 tsetenv(STRKTERM
, cp
);
110 #ifdef DOESNT_WORK_RIGHT
111 cp
= getenv("TERMCAP");
112 if (cp
&& (*cp
!= '/')) /* if TERMCAP and not a path */
113 Unsetenv(STRTERMCAP
);
114 #endif /* DOESNT_WORK_RIGHT */
116 if (noediting
&& Strcmp(cp
, STRnetwork
) != 0 &&
117 Strcmp(cp
, STRunknown
) != 0 && Strcmp(cp
, STRdumb
) != 0) {
120 set(STRedit
, Strsave(STRNULL
), VAR_READWRITE
);
122 ed_Init(); /* reset the editor */
124 else if (eq(vp
, STRhome
)) {
127 cp
= Strsave(varval(vp
)); /* get the old value back */
130 * convert to cononical pathname (possibly resolving symlinks)
134 set(vp
, Strsave(cp
), VAR_READWRITE
); /* have to save the new val */
136 /* and now mirror home with HOME */
137 tsetenv(STRKHOME
, cp
);
138 /* fix directory stack for new tilde home */
142 else if (eq(vp
, STRedit
)) {
145 /* PWP: add more stuff in here later */
147 else if (eq(vp
, STRshlvl
)) {
148 tsetenv(STRKSHLVL
, varval(vp
));
150 else if (eq(vp
, STRbackslash_quote
)) {
153 else if (eq(vp
, STRdirstack
)) {
156 else if (eq(vp
, STRrecognize_only_executables
)) {
159 else if (eq(vp
, STRkillring
)) {
160 SetKillRing(getn(varval(vp
)));
163 else if (eq(vp
, STRwatch
)) {
166 #endif /* HAVENOUTMP */
167 else if (eq(vp
, STRimplicitcd
)) {
168 implicit_cd
= ((eq(varval(vp
), STRverbose
)) ? 2 : 1);
171 else if (eq(vp
, STRcolor
)) {
174 #endif /* COLOR_LS_F */
175 #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE)
176 else if(eq(vp
, CHECK_MBYTEVAR
) || eq(vp
, STRnokanji
)) {
177 update_dspmbyte_vars();
181 else if (eq(vp
, STRcatalog
)) {
182 (void) catclose(catd
);
185 #if defined(FILEC) && defined(TIOCSTI)
186 else if (eq(vp
, STRfilec
))
189 #endif /* NLS_CATALOGS */
204 int flags
= VAR_READWRITE
;
205 bool first_match
= 0;
214 * Readonly addition From: Tim P. Starrin <noid@cyborg.larc.nasa.gov>
216 if (*v
&& eq(*v
, STRmr
)) {
217 flags
= VAR_READONLY
;
221 if (*v
&& eq(*v
, STRmf
) && !last_match
) {
226 if (*v
&& eq(*v
, STRml
) && !first_match
) {
234 plist(&shvhed
, flags
);
241 for (; alnum(*p
); p
++)
243 if (vp
== p
|| !letter(*vp
))
244 stderror(ERR_NAME
| ERR_VARBEGIN
);
245 if ((p
- vp
) > MAXVARLEN
) {
246 stderror(ERR_NAME
| ERR_VARTOOLONG
);
251 p
= getinx(p
, &subscr
);
253 if ((op
= *p
) != 0) {
255 if (*p
== 0 && *v
&& **v
== '(')
258 else if (*v
&& eq(*v
, STRequal
)) {
264 stderror(ERR_NAME
| ERR_SYNTAX
);
265 if (eq(p
, STRLparen
)) {
266 register Char
**e
= v
;
269 stderror(ERR_NAME
| ERR_SYNTAX
);
272 stderror(ERR_NAME
| ERR_MISSING
, ')');
285 set1(vp
, vecp
, &shvhed
, flags
);
290 asx(vp
, subscr
, Strsave(p
));
292 set(vp
, Strsave(p
), flags
);
294 } while ((p
= *v
++) != NULL
);
304 while (*cp
&& Isdigit(*cp
))
305 *ip
= *ip
* 10 + *cp
++ - '0';
307 stderror(ERR_NAME
| ERR_SUBSCRIPT
);
317 register struct varent
*v
= getvx(vp
, subscr
);
319 if (v
->v_flags
& VAR_READONLY
)
320 stderror(ERR_READONLY
|ERR_NAME
, v
->v_name
);
321 xfree((ptr_t
) v
->vec
[subscr
- 1]);
322 v
->vec
[subscr
- 1] = globone(p
, G_APPEND
);
325 static struct varent
*
330 register struct varent
*v
= adrof(vp
);
334 if (subscr
< 1 || subscr
> blklen(v
->vec
))
335 stderror(ERR_NAME
| ERR_RANGE
);
343 struct command
*dummy
;
361 for (; alnum(*p
); p
++)
363 if (vp
== p
|| !letter(*vp
))
364 stderror(ERR_NAME
| ERR_VARBEGIN
);
365 if ((p
- vp
) > MAXVARLEN
)
366 stderror(ERR_NAME
| ERR_VARTOOLONG
);
369 p
= getinx(p
, &subscr
);
376 stderror(ERR_NAME
| ERR_ASSIGN
);
379 * if there is no expression after the '=' then print a "Syntax Error"
382 if (*p
== '\0' && *v
== NULL
)
383 stderror(ERR_NAME
| ERR_ASSIGN
);
394 stderror(ERR_NAME
| ERR_UNKNOWNOP
);
400 stderror(ERR_NAME
| ERR_UNKNOWNOP
);
402 stderror(ERR_NAME
| ERR_SYNTAX
);
405 stderror(ERR_NAME
| ERR_UNKNOWNOP
);
413 set(vp
, p
, VAR_READWRITE
);
416 struct varent
*gv
= getvx(vp
, subscr
);
418 asx(vp
, subscr
, operate(op
, gv
->vec
[subscr
- 1], p
));
421 set(vp
, operate(op
, varval(vp
), p
), VAR_READWRITE
);
426 } while ((p
= *v
++) != NULL
);
438 xfree((ptr_t
) ** vp
);
441 return (putn(expr(vp
)));
451 register Char
**v
= vec
;
461 if (op
== '<' || op
== '>')
468 stderror(ERR_NAME
| ERR_EXPRESSION
);
472 static Char
*putp
, nbuf
[50];
485 num
= 2; /* confuse lint */
486 if (sizeof(int) == num
&& ((unsigned int) n
) == 0x8000) {
494 num
= 4; /* confuse lint */
495 if (sizeof(int) == num
&& ((unsigned int) n
) == 0x80000000) {
503 return (Strsave(nbuf
));
512 *putp
++ = n
% 10 + '0';
522 if (!cp
) /* PWP: extra error checking */
523 stderror(ERR_NAME
| ERR_BADNUM
);
526 if (cp
[0] == '+' && cp
[1])
532 stderror(ERR_NAME
| ERR_BADNUM
);
536 n
= n
* 10 + *cp
++ - '0';
538 stderror(ERR_NAME
| ERR_BADNUM
);
539 return (sign
? -n
: n
);
547 register struct varent
*vp
;
549 if (!var
|| !head
) /* PWP: extra error checking */
552 vp
= adrof1(var
, head
);
553 return ((vp
== NULL
|| vp
->vec
== NULL
|| vp
->vec
[0] == NULL
) ?
554 STRNULL
: vp
->vec
[0]);
557 static struct varent
*
560 register struct varent
*vp
;
562 register struct varent
*vp1
;
564 for (vp
= vp
->v_left
; vp
; vp
= vp
->v_right
) {
565 if (vp
->v_left
&& (vp1
= madrof(pat
, vp
)) != NULL
)
567 if (Gmatch(vp
->v_name
, pat
))
576 register struct varent
*v
;
581 while (v
&& ((cmp
= *name
- *v
->v_name
) != 0 ||
582 (cmp
= Strcmp(name
, v
->v_name
)) != 0))
591 * The caller is responsible for putting value in a safe place
598 register Char
**vec
= (Char
**) xmalloc((size_t) (2 * sizeof(Char
**)));
602 set1(var
, vec
, &shvhed
, flags
);
606 set1(var
, vec
, head
, flags
)
611 register Char
**oldv
= vec
;
613 if ((flags
& VAR_NOGLOB
) == 0) {
620 stderror(ERR_NAME
| ERR_NOMATCH
);
628 * Uniqueness addition from: Michael Veksler <mveksler@vnet.ibm.com>
630 if ( flags
& (VAR_FIRST
| VAR_LAST
) ) {
632 * Code for -f (VAR_FIRST) and -l (VAR_LAST) options.
634 * Delete all duplicate words leaving "holes" in the word array (vec).
635 * Then remove the "holes", keeping the order of the words unchanged.
637 if (vec
&& vec
[0] && vec
[1]) { /* more than one word ? */
641 for (num_items
= 0; vec
[num_items
]; num_items
++)
643 if (flags
& VAR_FIRST
) {
644 /* delete duplications, keeping first occurance */
645 for (i
= 1; i
< num_items
; i
++)
646 for (j
= 0; j
< i
; j
++)
647 /* If have earlier identical item, remove i'th item */
648 if (vec
[i
] && vec
[j
] && Strcmp(vec
[j
], vec
[i
]) == 0) {
653 } else if (flags
& VAR_LAST
) {
654 /* delete duplications, keeping last occurance */
655 for (i
= 0; i
< num_items
- 1; i
++)
656 for (j
= i
+ 1; j
< num_items
; j
++)
657 /* If have later identical item, remove i'th item */
658 if (vec
[i
] && vec
[j
] && Strcmp(vec
[j
], vec
[i
]) == 0) {
659 /* remove identical item (the first) */
664 /* Compress items - remove empty items */
665 for (j
= i
= 0; i
< num_items
; i
++)
669 /* NULL-fy remaining items */
670 for (; j
< num_items
; j
++)
673 /* don't let the attribute propagate */
674 flags
&= ~(VAR_FIRST
|VAR_LAST
);
676 setq(var
, vec
, head
, flags
);
681 setq(name
, vec
, p
, flags
)
683 register struct varent
*p
;
686 register struct varent
*c
;
689 f
= 0; /* tree hangs off the header's left link */
690 while ((c
= p
->v_link
[f
]) != 0) {
691 if ((f
= *name
- *c
->v_name
) == 0 &&
692 (f
= Strcmp(name
, c
->v_name
)) == 0) {
693 if (c
->v_flags
& VAR_READONLY
)
694 stderror(ERR_READONLY
|ERR_NAME
, c
->v_name
);
703 p
->v_link
[f
] = c
= (struct varent
*) xmalloc((size_t)sizeof(struct varent
));
704 c
->v_name
= Strsave(name
);
707 c
->v_left
= c
->v_right
= 0;
719 bool did_roe
, did_edit
;
722 did_roe
= adrof(STRrecognize_only_executables
) != NULL
;
723 did_edit
= adrof(STRedit
) != NULL
;
726 #if defined(FILEC) && defined(TIOCSTI)
727 if (adrof(STRfilec
) == 0)
729 #endif /* FILEC && TIOCSTI */
731 if (adrof(STRhistchars
) == 0) {
735 if (adrof(STRpromptchars
) == 0) {
739 if (adrof(STRhistlit
) == 0)
741 if (adrof(STRloginsh
) == 0)
743 if (adrof(STRwordchars
) == 0)
744 word_chars
= STR_WORD_CHARS
;
745 if (adrof(STRedit
) == 0)
747 if (adrof(STRbackslash_quote
) == 0)
749 if (adrof(STRsymlinks
) == 0)
751 if (adrof(STRimplicitcd
) == 0)
753 if (adrof(STRkillring
) == 0)
755 if (did_edit
&& noediting
&& adrof(STRedit
) == 0)
757 if (did_roe
&& adrof(STRrecognize_only_executables
) == 0)
760 if (adrof(STRcolor
) == 0)
762 #endif /* COLOR_LS_F */
763 #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE)
764 update_dspmbyte_vars();
767 (void) catclose(catd
);
769 #endif /* NLS_CATALOGS */
777 register struct varent
*vp
;
782 while ((vp
= madrof(*v
, head
)) != NULL
)
783 if (vp
->v_flags
& VAR_READONLY
)
784 stderror(ERR_READONLY
|ERR_NAME
, vp
->v_name
);
788 setname(short2str(*v
));
796 register struct varent
*vp
;
798 if ((vp
= adrof1(var
, &shvhed
)) == 0)
805 register struct varent
*p
;
807 register struct varent
*c
, *pp
;
811 * Free associated memory first to avoid complications.
814 xfree((ptr_t
) p
->v_name
);
816 * If p is missing one child, then we can move the other into where p is.
817 * Otherwise, we find the predecessor of p, which is guaranteed to have no
818 * right child, copy it into p, and move it's left child into it.
822 else if (p
->v_left
== 0)
825 for (c
= p
->v_left
; c
->v_right
; c
= c
->v_right
)
827 p
->v_name
= c
->v_name
;
828 p
->v_flags
= c
->v_flags
;
835 * Move c into where p is.
838 f
= pp
->v_right
== p
;
839 if ((pp
->v_link
[f
] = c
) != 0)
842 * Free the deleted node, and rebalance.
852 set(cp
, Strsave(STRNULL
), VAR_READWRITE
);
861 register struct varent
*argv
;
872 if (argv
== NULL
|| argv
->vec
== NULL
)
874 if (argv
->vec
[0] == 0)
875 stderror(ERR_NAME
| ERR_NOMORE
);
876 lshift(argv
->vec
, 1);
880 static Char STRsep
[2] = { PATHSEP
, '\0' };
887 size_t exppath_size
= BUFSIZE
;
888 exppath
= (Char
*)xmalloc(sizeof(Char
)*exppath_size
);
893 while (Strlen(*val
) + Strlen(exppath
) + 2 > exppath_size
) {
895 = (Char
*)xrealloc(exppath
, sizeof(Char
)*(exppath_size
*= 2)))
898 "Warning: ridiculously long PATH truncated\n"));
902 (void) Strcat(exppath
, *val
++);
903 if (*val
== 0 || eq(*val
, STRRparen
))
905 (void) Strcat(exppath
, STRsep
);
907 tsetenv(STRKPATH
, exppath
);
913 * Lint thinks these have null effect
915 /* macros to do single rotations on node p */
916 # define rright(p) (\
918 (t)->v_parent = (p)->v_parent,\
919 (((p)->v_left = t->v_right) != NULL) ?\
920 (t->v_right->v_parent = (p)) : 0,\
921 (t->v_right = (p))->v_parent = t,\
925 ((t)->v_parent = (p)->v_parent,\
926 ((p)->v_right = t->v_left) != NULL) ? \
927 (t->v_left->v_parent = (p)) : 0,\
928 (t->v_left = (p))->v_parent = t,\
931 static struct varent
*
937 static struct varent
*
948 * Rebalance a tree, starting at p and up.
949 * F == 0 means we've come from p's left child.
950 * D == 1 means we've just done a delete, otherwise an insert.
954 register struct varent
*p
;
957 register struct varent
*pp
;
960 register struct varent
*t
; /* used by the rotate macros */
964 ff
= 0; /* Sun's lint is dumb! */
968 * Ok, from here on, p is the node we're operating on; pp is it's parent; f
969 * is the branch of p from which we have come; ff is the branch of pp which
972 for (; (pp
= p
->v_parent
) != 0; p
= pp
, f
= ff
) {
973 ff
= pp
->v_right
== p
;
974 if (f
^ d
) { /* right heavy */
976 case -1: /* was left heavy */
979 case 0: /* was balanced */
982 case 1: /* was already right heavy */
983 switch (p
->v_right
->v_bal
) {
984 case 1: /* sigle rotate */
985 pp
->v_link
[ff
] = rleft(p
);
986 p
->v_left
->v_bal
= 0;
989 case 0: /* single rotate */
990 pp
->v_link
[ff
] = rleft(p
);
991 p
->v_left
->v_bal
= 1;
994 case -1: /* double rotate */
995 (void) rright(p
->v_right
);
996 pp
->v_link
[ff
] = rleft(p
);
998 p
->v_bal
< 1 ? 0 : -1;
1000 p
->v_bal
> -1 ? 0 : 1;
1011 else { /* left heavy */
1013 case 1: /* was right heavy */
1016 case 0: /* was balanced */
1019 case -1: /* was already left heavy */
1020 switch (p
->v_left
->v_bal
) {
1021 case -1: /* single rotate */
1022 pp
->v_link
[ff
] = rright(p
);
1023 p
->v_right
->v_bal
= 0;
1026 case 0: /* signle rotate */
1027 pp
->v_link
[ff
] = rright(p
);
1028 p
->v_right
->v_bal
= -1;
1031 case 1: /* double rotate */
1032 (void) rleft(p
->v_left
);
1033 pp
->v_link
[ff
] = rright(p
);
1035 p
->v_bal
< 1 ? 0 : -1;
1037 p
->v_bal
> -1 ? 0 : 1;
1049 * If from insert, then we terminate when p is balanced. If from
1050 * delete, then we terminate when p is unbalanced.
1052 if ((p
->v_bal
== 0) ^ d
)
1059 register struct varent
*p
;
1062 register struct varent
*c
;
1067 (void) sigsetmask(sigblock((sigmask_t
) 0) & ~sigmask(SIGINT
));
1068 #else /* !BSDSIGS */
1069 (void) sigrelse(SIGINT
);
1070 #endif /* BSDSIGS */
1076 if (p
->v_parent
== 0) /* is it the header? */
1078 if ((p
->v_flags
& what
) != 0) {
1079 len
= blklen(p
->vec
);
1080 xprintf("%S\t", p
->v_name
);
1095 } while (p
->v_right
== c
);
1100 #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE)
1104 update_dspmbyte_vars()
1110 /* if variable "nokanji" is set, multi-byte display is disabled */
1111 if ((vp
= adrof(CHECK_MBYTEVAR
)) && !adrof(STRnokanji
)) {
1114 if(eq (dstr1
, STRKSJIS
))
1116 else if (eq(dstr1
, STRKEUC
))
1118 else if (eq(dstr1
, STRKBIG5
))
1120 else if (eq(dstr1
, STRKUTF8
))
1122 else if ((dstr1
[0] - '0') >= 0 && (dstr1
[0] - '0') <= 3) {
1126 xprintf(CGETS(18, 2,
1127 "Warning: unknown multibyte display; using default(euc(JP))\n"));
1130 if (dstr1
&& vp
->vec
[1] && eq(vp
->vec
[1], STRls
))
1134 for (lp
= 0; lp
< 256 && iskcode
> 0; lp
++) {
1138 _cmap
[lp
] = _cmap_mbyte
[lp
];
1139 _mbmap
[lp
] = _mbmap_sjis
[lp
];
1143 _cmap
[lp
] = _cmap_mbyte
[lp
];
1144 _mbmap
[lp
] = _mbmap_euc
[lp
];
1148 _cmap
[lp
] = _cmap_mbyte
[lp
];
1149 _mbmap
[lp
] = _mbmap_big5
[lp
];
1153 _cmap
[lp
] = _cmap_mbyte
[lp
];
1154 _mbmap
[lp
] = _mbmap_utf8
[lp
];
1157 xprintf(CGETS(18, 3,
1158 "Warning: unknown multibyte code %d; multibyte disabled\n"),
1160 _cmap
[lp
] = _cmap_c
[lp
];
1161 _mbmap
[lp
] = 0; /* Default map all 0 */
1167 /* check original table */
1168 if (Strlen(dstr1
) != 256) {
1169 xprintf(CGETS(18, 4,
1170 "Warning: Invalid multibyte table length (%d); multibyte disabled\n"),
1174 for (lp
= 0; lp
< 256 && _enable_mbdisp
== 1; lp
++) {
1175 if (!((dstr1
[lp
] - '0') >= 0 && (dstr1
[lp
] - '0') <= 3)) {
1176 xprintf(CGETS(18, 4,
1177 "Warning: bad multibyte code at offset +%d; multibyte diabled\n"),
1183 /* set original table */
1184 for (lp
= 0; lp
< 256; lp
++) {
1185 if (_enable_mbdisp
== 1) {
1186 _cmap
[lp
] = _cmap_mbyte
[lp
];
1187 _mbmap
[lp
] = (unsigned short) ((dstr1
[lp
] - '0') & 0x0f);
1190 _cmap
[lp
] = _cmap_c
[lp
];
1191 _mbmap
[lp
] = 0; /* Default map all 0 */
1197 for (lp
= 0; lp
< 256; lp
++) {
1198 _cmap
[lp
] = _cmap_c
[lp
];
1199 _mbmap
[lp
] = 0; /* Default map all 0 */
1204 #ifdef MBYTEDEBUG /* Sorry, use for beta testing */
1207 for (lp
= 0; lp
< 256; lp
++) {
1208 mbmapstr
[lp
] = _mbmap
[lp
] + '0';
1211 set(STRmbytemap
, Strsave(mbmapstr
), VAR_READWRITE
);
1213 #endif /* MBYTEMAP */
1216 /* dspkanji/dspmbyte autosetting */
1217 /* PATCH IDEA FROM Issei.Suzuki VERY THANKS */
1219 autoset_dspmbyte(pcp
)
1223 struct dspm_autoset_Table
{
1227 { STRLANGEUCJP
, STRKEUC
},
1228 { STRLANGEUCKR
, STRKEUC
},
1229 { STRLANGEUCZH
, STRKEUC
},
1230 { STRLANGEUCJPB
, STRKEUC
},
1231 { STRLANGEUCKRB
, STRKEUC
},
1232 { STRLANGEUCZHB
, STRKEUC
},
1233 { STRLANGSJIS
, STRKSJIS
},
1234 { STRLANGSJISB
, STRKSJIS
},
1235 { STRLANGBIG5
, STRKBIG5
},
1242 for (i
= 0; dspmt
[i
].n
; i
++) {
1243 if (eq(pcp
, dspmt
[i
].n
)) {
1244 set(CHECK_MBYTEVAR
, Strsave(dspmt
[i
].v
), VAR_READWRITE
);
1245 update_dspmbyte_vars();