[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.14

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