[BACK]Return to modes.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

Annotation of src/usr.bin/mg/modes.c, Revision 1.10

1.10    ! db          1: /*     $OpenBSD: modes.c,v 1.9 2004/07/22 01:25:25 vincent Exp $       */
1.4       niklas      2:
1.1       deraadt     3: /*
1.5       mickey      4:  * Commands to toggle modes.   Without an argument, these functions will
                      5:  * toggle the given mode.  A negative or zero argument will turn the mode
1.3       millert     6:  * off.  A positive argument will turn the mode on.
1.1       deraadt     7:  */
                      8:
                      9: #include "def.h"
                     10: #include "kbd.h"
                     11:
1.7       millert    12: static int     changemode(int, int, char *);
1.3       millert    13:
                     14: int     defb_nmodes = 0;
1.6       art        15: MAPS   *defb_modes[PBMODES] = { &fundamental_mode };
1.3       millert    16: int     defb_flag = 0;
1.2       millert    17:
                     18: static int
1.8       vincent    19: changemode(int f, int n, char *mode)
1.2       millert    20: {
1.3       millert    21:        int      i;
                     22:        MAPS    *m;
1.2       millert    23:
                     24:        if ((m = name_mode(mode)) == NULL) {
                     25:                ewprintf("Can't find mode %s", mode);
1.10    ! db         26:                return (FALSE);
1.2       millert    27:        }
                     28:        if (!(f & FFARG)) {
                     29:                for (i = 0; i <= curbp->b_nmodes; i++)
                     30:                        if (curbp->b_modes[i] == m) {
1.3       millert    31:                                /* mode already set */
                     32:                                n = 0;
1.2       millert    33:                                break;
                     34:                        }
                     35:        }
                     36:        if (n > 0) {
                     37:                for (i = 0; i <= curbp->b_nmodes; i++)
                     38:                        if (curbp->b_modes[i] == m)
1.3       millert    39:                                /* mode already set */
1.10    ! db         40:                                return (TRUE);
1.2       millert    41:                if (curbp->b_nmodes >= PBMODES - 1) {
                     42:                        ewprintf("Too many modes");
1.10    ! db         43:                        return (FALSE);
1.2       millert    44:                }
                     45:                curbp->b_modes[++(curbp->b_nmodes)] = m;
                     46:        } else {
                     47:                /* fundamental is b_modes[0] and can't be unset */
1.5       mickey     48:                for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
1.3       millert    49:                    i++);
1.2       millert    50:                if (i > curbp->b_nmodes)
1.10    ! db         51:                        return (TRUE);  /* mode wasn't set */
1.2       millert    52:                for (; i < curbp->b_nmodes; i++)
                     53:                        curbp->b_modes[i] = curbp->b_modes[i + 1];
                     54:                curbp->b_nmodes--;
                     55:        }
                     56:        upmodes(curbp);
1.10    ! db         57:        return (TRUE);
1.1       deraadt    58: }
                     59:
1.3       millert    60: int
1.8       vincent    61: indentmode(int f, int n)
1.1       deraadt    62: {
1.10    ! db         63:        return (changemode(f, n, "indent"));
1.1       deraadt    64: }
                     65:
1.3       millert    66: int
1.8       vincent    67: fillmode(int f, int n)
1.1       deraadt    68: {
1.10    ! db         69:        return (changemode(f, n, "fill"));
1.1       deraadt    70: }
                     71:
                     72: /*
                     73:  * Fake the GNU "blink-matching-paren" variable.
                     74:  */
1.3       millert    75: int
1.8       vincent    76: blinkparen(int f, int n)
1.1       deraadt    77: {
1.10    ! db         78:        return (changemode(f, n, "blink"));
1.1       deraadt    79: }
                     80:
1.3       millert    81: #ifdef NOTAB
                     82: int
1.8       vincent    83: notabmode(int f, int n)
1.1       deraadt    84: {
1.2       millert    85:        if (changemode(f, n, "notab") == FALSE)
1.10    ! db         86:                return (FALSE);
1.2       millert    87:        if (f & FFARG) {
                     88:                if (n <= 0)
                     89:                        curbp->b_flag &= ~BFNOTAB;
                     90:                else
                     91:                        curbp->b_flag |= BFNOTAB;
                     92:        } else
                     93:                curbp->b_flag ^= BFNOTAB;
1.10    ! db         94:        return (TRUE);
1.1       deraadt    95: }
1.3       millert    96: #endif /* NOTAB */
1.1       deraadt    97:
1.3       millert    98: int
1.8       vincent    99: overwrite(int f, int n)
1.1       deraadt   100: {
1.2       millert   101:        if (changemode(f, n, "overwrite") == FALSE)
1.10    ! db        102:                return (FALSE);
1.2       millert   103:        if (f & FFARG) {
                    104:                if (n <= 0)
                    105:                        curbp->b_flag &= ~BFOVERWRITE;
                    106:                else
                    107:                        curbp->b_flag |= BFOVERWRITE;
                    108:        } else
                    109:                curbp->b_flag ^= BFOVERWRITE;
1.10    ! db        110:        return (TRUE);
1.1       deraadt   111: }
                    112:
1.3       millert   113: int
1.8       vincent   114: set_default_mode(int f, int n)
1.1       deraadt   115: {
1.3       millert   116:        int      i;
                    117:        MAPS    *m;
1.9       vincent   118:        char     mode[32], *bufp;
1.2       millert   119:
1.9       vincent   120:        if ((bufp = eread("Set Default Mode: ", mode, 32, EFNEW)) == NULL)
1.10    ! db        121:                return (ABORT);
1.9       vincent   122:        else if (bufp[0] == '\0')
1.10    ! db        123:                return (FALSE);
1.2       millert   124:        if ((m = name_mode(mode)) == NULL) {
                    125:                ewprintf("can't find mode %s", mode);
1.10    ! db        126:                return (FALSE);
1.2       millert   127:        }
                    128:        if (!(f & FFARG)) {
                    129:                for (i = 0; i <= defb_nmodes; i++)
                    130:                        if (defb_modes[i] == m) {
1.3       millert   131:                                /* mode already set */
                    132:                                n = 0;
1.2       millert   133:                                break;
                    134:                        }
                    135:        }
                    136:        if (n > 0) {
                    137:                for (i = 0; i <= defb_nmodes; i++)
                    138:                        if (defb_modes[i] == m)
1.3       millert   139:                                /* mode already set */
1.10    ! db        140:                                return (TRUE);
1.2       millert   141:                if (defb_nmodes >= PBMODES - 1) {
                    142:                        ewprintf("Too many modes");
1.10    ! db        143:                        return (FALSE);
1.2       millert   144:                }
                    145:                defb_modes[++defb_nmodes] = m;
                    146:        } else {
                    147:                /* fundamental is defb_modes[0] and can't be unset */
1.3       millert   148:                for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
1.2       millert   149:                if (i > defb_nmodes)
1.3       millert   150:                        /* mode was not set */
1.10    ! db        151:                        return (TRUE);
1.2       millert   152:                for (; i < defb_nmodes; i++)
                    153:                        defb_modes[i] = defb_modes[i + 1];
                    154:                defb_nmodes--;
                    155:        }
1.3       millert   156:        if (strcmp(mode, "overwrite") == 0) {
1.5       mickey    157:                if (n <= 0)
1.2       millert   158:                        defb_flag &= ~BFOVERWRITE;
1.5       mickey    159:                else
1.2       millert   160:                        defb_flag |= BFOVERWRITE;
1.3       millert   161:        }
1.1       deraadt   162: #ifdef NOTAB
1.2       millert   163:        if (strcmp(mode, "notab") == 0)
                    164:                if (n <= 0)
                    165:                        defb_flag &= ~BFNOTAB;
                    166:                else
                    167:                        defb_flag |= BFNOTAB;
1.3       millert   168: #endif /* NOTAB */
1.10    ! db        169:        return (TRUE);
1.1       deraadt   170: }