# 2.11BSD#431 - /usr/src/local/less/prompt.c

##### Functions

    eq_message        X
    pr_string         X

##### Variables

    prproto           X
    public            X

       1: /*
       2:  * Prompting and other messages.
       3:  * There are three flavors of prompts, SHORT, MEDIUM and LONG,
       4:  * selected by the -m/-M options.
       5:  * A prompt is either a colon or a message composed of various
       6:  * pieces, such as the name of the file being viewed, the percentage
       7:  * into the file, etc.
       8:  */
       9:
      10: #include "less.h"
      11: #include "position.h"
      12:
      13: extern int pr_type;
      14: extern int ispipe;
      15: extern int hit_eof;
      16: extern int new_file;
      17: extern int sc_width;
      18: extern char current_file[];
      19: extern int ac;
      20: extern char **av;
      21: extern int curr_ac;
      22:
      23: /*
      24:  * Prototypes for the three flavors of prompts.
      25:  * These strings are expanded by pr_expand().
      26:  */
      27: char *prproto[] = {
      28:     "fo",       /* PR_SHORT */
      29:     "foP",      /* PR_MEDIUM */
      30:     "Fobp"      /* PR_LONG */
      31: };
      32:
      33: static char message[200];
      34: static char *mp;
      35:
      36:     static void
      37: setmp()
      38: {
      39:     mp = message + strlen(message);
      40: }
      41:
      42: /*
      43:  * Append the name of the current file (to the message buffer).
      44:  */
      45:     static void
      46: ap_filename()
      47: {
      48:     if (ispipe)
      49:         return;
      50:     strtcpy(mp, current_file, &message[sizeof(message)] - mp);
      51:     setmp();
      52: }
      53:
      54: /*
      55:  * Append the "file N of M" message.
      56:  */
      57:     static void
      58: ap_of()
      59: {
      60:     if (ac <= 1)
      61:         return;
      62:     sprintf(mp, " (file %d of %d)", curr_ac+1, ac);
      63:     setmp();
      64: }
      65:
      66: /*
      67:  * Append the byte offset into the current file.
      68:  */
      69:     static void
      70: ap_byte()
      71: {
      72:     POSITION pos, len;
      73:
      74:     pos = position(BOTTOM_PLUS_ONE);
      75:     if (pos == NULL_POSITION)
      76:         pos = ch_length();
      77:     if (pos != NULL_POSITION)
      78:     {
      79:         sprintf(mp, " byte %ld", (long)pos);
      80:         setmp();
      81:         len = ch_length();
      82:         if (len > 0)
      83:         {
      84:             sprintf(mp, "/%ld", (long)len);
      85:             setmp();
      86:         }
      87:     }
      88: }
      89:
      90: /*
      91:  * Append the percentage into the current file.
      92:  * If we cannot find the percentage and must_print is true,
      93:  * use the byte offset.
      94:  */
      95:     static void
      96: ap_percent(must_print)
      97: {
      98:     POSITION pos,len;
      99:
     100:     pos = position(BOTTOM_PLUS_ONE);
     101:     len = ch_length();
     102:     if (len > 0 && pos != NULL_POSITION)
     103:     {
     104:         sprintf(mp, " (%ld%%)", (100 * (long)pos) / len);
     105:         setmp();
     106:     } else if (must_print)
     107:         ap_byte();
     108: }
     109:
     110: /*
     111:  * Append the end-of-file message.
     112:  */
     113:     static void
     114: ap_eof()
     115: {
     116:     strcpy(mp, " (END)");
     117:     setmp();
     118:     if (curr_ac + 1 < ac)
     119:     {
     120:         sprintf(mp, " - Next: %s", av[curr_ac+1]);
     121:         setmp();
     122:     }
     123: }
     124:
     125: /*
     126:  * Construct a message based on a prototype string.
     127:  */
     128:     static char *
     129: pr_expand(proto, maxwidth)
     130:     char *proto;
     131:     int maxwidth;
     132: {
     133:     register char *p;
     134:
     135:     mp = message;
     136:
     137:     for (p = proto;  *p != '\0';  p++)
     138:     {
     139:         if (maxwidth > 0 && mp >= message + maxwidth)
     140:         {
     141:             /*
     142: 			 * Truncate to the screen width.
     143: 			 * {{ This isn't very nice. }}
     144: 			 */
     145:             mp = message + maxwidth;
     146:             break;
     147:         }
     148:         switch (*p)
     149:         {
     150:         case 'f':
     151:             if (new_file)
     152:                 ap_filename();
     153:             break;
     154:         case 'F':
     155:             ap_filename();
     156:             break;
     157:         case 'o':
     158:             if (new_file)
     159:                 ap_of();
     160:             break;
     161:         case 'O':
     162:             ap_of();
     163:             break;
     164:         case 'b':
     165:             ap_byte();
     166:             break;
     167:         case 'p':
     168:             if (!hit_eof)
     169:                 ap_percent(0);
     170:             break;
     171:         case 'P':
     172:             if (!hit_eof)
     173:                 ap_percent(1);
     174:             break;
     175:         case '<':
     176:             while (*++p != '>')
     177:             {
     178:                 if (*p == '\0')
     179:                 {
     180:                     p--;
     181:                     break;
     182:                 }
     183:                 *mp++ = *p;
     184:             }
     185:             break;
     186:         default:
     187:             *mp++ = *p;
     188:             break;
     189:         }
     190:     }
     191:     if (hit_eof)
     192:         ap_eof();
     193:
     194:     new_file = 0;
     195:     if (mp == message)
     196:         return (NULL);
     197:     *mp = '\0';
     198:     return (message);
     199: }
     200:
     201: /*
     202:  * Return a message suitable for printing by the "=" command.
     203:  */
     204:     public char *
     205: eq_message()
     206: {
     207:     return (pr_expand("FObp", 0));
     208: }
     209:
     210: /*
     211:  * Return a prompt.
     212:  * This depends on the prompt type (SHORT, MEDIUM, LONG), etc.
     213:  * If we can't come up with an appropriate prompt, return NULL
     214:  * and the caller will prompt with a colon.
     215:  */
     216:     public char *
     217: pr_string()
     218: {
     219:     return (pr_expand(prproto[pr_type], sc_width-2));
     220: }

#### Defined functions

ap_byte defined in line 69; used 2 times

- in line 107, 165

ap_eof defined in line 113; used 1 times

- in line 192

ap_filename defined in line 45; used 2 times

- in line 152-155(2)

ap_of defined in line 57; used 2 times

- in line 159-162(2)

ap_percent defined in line 95; used 2 times

- in line 169-173(2)

eq_message defined in line 204; used 2 times

- in /usr/src/local/less/command.c line 476
- in /usr/src/local/less/funcs.h line 65

pr_expand defined in line 128; used 2 times

- in line 207, 219

pr_string defined in line 216; used 2 times

- in /usr/src/local/less/command.c line 170
- in /usr/src/local/less/funcs.h line 66

setmp defined in line 36; used 7 times

- in line 51, 63, 80-85(2), 105, 117-121(2)

#### Defined variables

message defined in line 33; used 9 times

- in line 39(2), 50(2), 135-139(2), 145, 195-198(2)

mp defined in line 34; used 16 times

- in line 39, 50(2), 62, 79-84(2), 104, 116-120(2), 135-139(2), 145, 183-187(2), 195-197(2)

prproto defined in line 27; used 4 times

- in line 219
- in /usr/src/local/less/option.c line 304-306(3)

public defined in line 216; never used

Last modified: 1990-07-10 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 739 |