void pr_scaps() { char *retptr; char padbuffer[512]; /* Backspace if not "^H" */ if (verbose) (void) fprintf(trace, "looking at 'bc'\n"); retptr = cconvert(rmpadding(cursor_left, padbuffer, (int *) 0)); if (strcmp("\\b", retptr) != 0) pr_string((char *)0, "bc", (char *)0, cursor_left); /* Newline character (default "\n") */ if (verbose) (void) fprintf(trace, "looking at 'nl'\n"); retptr = cconvert(rmpadding(cursor_down, padbuffer, (int *) 0)); if (strcmp("\\n", retptr) != 0) pr_string((char *)0, "nl", (char *)0, cursor_down); /* Handle "ko" here: Termcap entries for other non-function keys */ pr_ko(); /* Ignore "ma": Arrow key map, used by vi version 2 only */ }
/* A capability gets an at-sign if it no longer exists, but one of the relative entries contains a value for it. It gets printed if the original value is not seen in ANY of the relative entries, or if the FIRST relative entry that has the capability gives a DIFFERENT value for the capability. */ void dorelative(int firstoptind, int argc, char **argv) { register int i; /* turn off printing of termcap and long names */ pr_init(pr_terminfo); /* print out the entry name */ pr_heading((char *)0, savettytype); pr_bheading(); /* Print out all bools that are different. */ for (i = 0; i < numbools; i++) if (!ibool[i].val && ibool[i].changed) pr_boolean(ibool[i].infoname, (char *)0, (char *)0, -1); else if (ibool[i].val && (ibool[i].changed || !ibool[i].seenagain)) pr_boolean(ibool[i].infoname, (char *)0, (char *)0, 1); pr_bfooting(); pr_nheading(); /* Print out all nums that are different. */ for (i = 0; i < numnums; i++) if (num[i].val < 0 && num[i].changed) pr_number(num[i].infoname, (char *)0, (char *)0, -1); else if (num[i].val >= 0 && (num[i].changed || !num[i].seenagain)) pr_number(num[i].infoname, (char *)0, (char *)0, num[i].val); pr_nfooting(); pr_sheading(); /* Print out all strs that are different. */ for (i = 0; i < numstrs; i++) if (str[i].val == NULL && str[i].changed) pr_string(str[i].infoname, (char *)0, (char *)0, (char *)0); else if ((str[i].val != NULL) && (str[i].changed || !str[i].seenagain)) pr_string(str[i].infoname, (char *)0, (char *)0, str[i].val); pr_sfooting(); /* Finish it up. */ for (i = firstoptind; i < argc; i++) if (used[i - firstoptind]) (void) printf("\tuse=%s,\n", argv[i]); else (void) fprintf(stderr, "%s: 'use=%s' did not add anything to the " "description.\n", progname, argv[i]); }
static void print_no_use_entry(void) { int i; pr_heading("", buflongname); pr_bheading(); for (i = 0; boolcodes[i]; i++) if (boolval[0][i]) pr_boolean(boolnames[i], (char *)0, (char *)0, 1); pr_bfooting(); pr_sheading(); for (i = 0; numcodes[i]; i++) if (numval[0][i] > -1) pr_number(numnames[i], (char *)0, (char *)0, numval[0][i]); pr_nfooting(); pr_sheading(); for (i = 0; strcodes[i]; i++) if (strval[0][i]) pr_string(strnames[i], (char *)0, (char *)0, strval[0][i]); pr_sfooting(); }
static void print_use_entry(char *usename) { int i; pr_heading("", buflongname); pr_bheading(); for (i = 0; boolcodes[i]; i++) if (boolval[0][i] && !boolval[1][i]) pr_boolean(boolnames[i], (char *)0, (char *)0, 1); else if (!boolval[0][i] && boolval[1][i]) pr_boolean(boolnames[i], (char *)0, (char *)0, -1); pr_bfooting(); pr_nheading(); for (i = 0; numcodes[i]; i++) if ((numval[0][i] > -1) && (numval[0][i] != numval[1][i])) pr_number(numnames[i], (char *)0, (char *)0, numval[0][i]); else if ((numval [0] [i] == -1) && (numval [1] [i] > -1)) pr_number(numnames[i], (char *)0, (char *)0, -1); pr_nfooting(); pr_sheading(); for (i = 0; strcodes[i]; i++) /* print out str[0] if: */ /* str[0] != NULL and str[1] == NULL, or str[0] != str[1] */ if (strval[0][i] && ((strval[1][i] == NULL) || (strcmp(strval[0][i], strval[1][i]) != 0))) pr_string(strnames[i], (char *)0, (char *)0, strval[0][i]); /* print out @ if str[0] == NULL and str[1] != NULL */ else if (strval[0][i] == NULL && strval[1][i] != NULL) pr_string(strnames[i], (char *)0, (char *)0, (char *)0); pr_sfooting(); (void) printf("\tuse=%s,\n", usename); }
/* Run the actual formatting. OUTFNC and OUTFNCARG are the output functions. FORMAT is format string ARGSPECS is the parsed format string, ARGSPECS_LEN the number of items in ARGSPECS. VALUETABLE holds the values and may be directly addressed using the position arguments given by ARGSPECS. MYERRNO is used for the "%m" conversion. NBYTES well be updated to reflect the number of bytes send to the output function. */ static int do_format (estream_printf_out_t outfnc, void *outfncarg, const char *format, argspec_t argspecs, size_t argspecs_len, valueitem_t valuetable, int myerrno, size_t *nbytes) { int rc = 0; const char *s; argspec_t arg = argspecs; int argidx = 0; /* Only used for assertion. */ size_t n; value_t value; s = format; while ( *s ) { if (*s != '%') { s++; continue; } if (s != format) { rc = outfnc (outfncarg, format, (n=s-format)); if (rc) return rc; *nbytes += n; } if (s[1] == '%') { /* Note that this code ignores one trailing percent escape - this is however okay as the args parser must have detected this already. */ rc = outfnc (outfncarg, s, 1); if (rc) return rc; *nbytes += 1; s += 2; format = s; continue; } /* Save the next start. */ s += arg->length; format = s; assert (argidx < argspecs_len); argidx++; /* Apply indirect field width and precision values. */ if (arg->width == STAR_FIELD_VALUE) { assert (valuetable[arg->width_pos-1].vt == VALTYPE_INT); arg->width = valuetable[arg->width_pos-1].value.a_int; if (arg->width < 0) { arg->width = -arg->width; arg->flags |= FLAG_LEFT_JUST; } } if (arg->precision == STAR_FIELD_VALUE) { assert (valuetable[arg->precision_pos-1].vt == VALTYPE_INT); arg->precision = valuetable[arg->precision_pos-1].value.a_int; if (arg->precision < 0) arg->precision = NO_FIELD_VALUE; } if (arg->arg_pos == -1 && arg->conspec == CONSPEC_STRERROR) value.a_string = strerror (myerrno); else { assert (arg->vt == valuetable[arg->arg_pos-1].vt); value = valuetable[arg->arg_pos-1].value; } switch (arg->conspec) { case CONSPEC_UNKNOWN: assert (!"bug"); break; case CONSPEC_DECIMAL: case CONSPEC_UNSIGNED: case CONSPEC_OCTAL: case CONSPEC_HEX: case CONSPEC_HEX_UP: rc = pr_integer (outfnc, outfncarg, arg, value, nbytes); break; case CONSPEC_FLOAT: case CONSPEC_FLOAT_UP: case CONSPEC_EXP: case CONSPEC_EXP_UP: case CONSPEC_F_OR_G: case CONSPEC_F_OR_G_UP: case CONSPEC_HEX_EXP: case CONSPEC_HEX_EXP_UP: rc = pr_float (outfnc, outfncarg, arg, value, nbytes); break; case CONSPEC_CHAR: rc = pr_char (outfnc, outfncarg, arg, value, nbytes); break; case CONSPEC_STRING: case CONSPEC_STRERROR: rc = pr_string (outfnc, outfncarg, arg, value, nbytes); break; case CONSPEC_POINTER: rc = pr_pointer (outfnc, outfncarg, arg, value, nbytes); break; case CONSPEC_BYTES_SO_FAR: rc = pr_bytes_so_far (outfnc, outfncarg, arg, value, nbytes); break; } if (rc) return rc; arg++; } /* Print out any trailing stuff. */ n = s - format; rc = n? outfnc (outfncarg, format, n) : 0; if (!rc) *nbytes += n; return rc; }
/* Set up the n'th terminal. */ static void check_nth_terminal(char *nterm, int n) { register char boolval; register short numval; register char *strval; register int i; if (use) used[n] = FALSE; if (verbose) (void) fprintf(trace, "adding in terminal type '%s'.\n", nterm); (void) setupterm(nterm, devnull, (int *) 0); if (printing != pr_none) { pr_heading(nterm, ttytype); pr_bheading(); } if (diff || common || neither) { if (Aflag && Bflag) (void) printf("comparing %s (TERMINFO=%s) to %s " "(TERMINFO=%s).\n", firstterm, term1info, nterm, term2info); else if (Aflag) (void) printf("comparing %s (TERMINFO=%s) to %s.\n", firstterm, term1info, nterm); else if (Bflag) (void) printf("comparing %s to %s (TERMINFO=%s).\n", firstterm, nterm, term2info); else (void) printf("comparing %s to %s.\n", firstterm, nterm); (void) printf(" comparing booleans.\n"); } /* save away the values for the nth terminal */ for (i = 0; i < numbools; i++) { boolval = tgetflag(ibool[i].capname); if (use) { if (ibool[i].seenagain) { /* ** We do not have to worry about this impossible case ** since booleans can have only two values: true and ** false. ** if (boolval && (boolval != ibool[i].secondval)) ** { ** (void) fprintf(trace, "use= order dependency" ** "found:\n"); ** (void) fprintf(trace, " %s: %s has %d, %s has" ** " %d.\n", ** ibool[i].capname, ibool[i].secondname, ** ibool[i].secondval, nterm, boolval); ** } */ } else { if (boolval == TRUE) { ibool[i].seenagain = TRUE; ibool[i].secondval = boolval; ibool[i].secondname = nterm; if (ibool[i].val != boolval) ibool[i].changed = TRUE; else used[n] = TRUE; } } } if (boolval) { if (printing != pr_none) pr_boolean(ibool[i].infoname, ibool[i].capname, ibool[i].fullname, 1); if (common && (ibool[i].val == boolval)) (void) printf("\t%s= T.\n", ibool[i].infoname); } else if (neither && !ibool[i].val) (void) printf("\t!%s.\n", ibool[i].infoname); if (diff && (ibool[i].val != boolval)) (void) printf("\t%s: %c:%c.\n", ibool[i].infoname, ibool[i].val?'T':'F', boolval?'T':'F'); if (verbose) (void) fprintf(trace, "%s: %d:%d, changed=%d, " "seen=%d.\n", ibool[i].infoname, ibool[i].val, boolval, ibool[i].changed, ibool[i].seenagain); } if (printing != pr_none) { if (printing == pr_cap) pr_bcaps(); pr_bfooting(); pr_nheading(); } if (diff || common || neither) (void) printf(" comparing numbers.\n"); for (i = 0; i < numnums; i++) { numval = tgetnum(num[i].capname); if (use) { if (num[i].seenagain) { if ((numval > -1) && (numval != num[i].secondval)) { (void) fprintf(stderr, "%s: use = order dependency " "found:\n", progname); (void) fprintf(stderr, " %s: %s " "has %d, %s has %d.\n", num[i].capname, num[i].secondname, num[i].secondval, nterm, numval); } } else { if (numval > -1) { num[i].seenagain = TRUE; num[i].secondval = numval; num[i].secondname = nterm; if ((numval > -1) && (num[i].val != numval)) num[i].changed = TRUE; else used[n] = TRUE; } } } if (numval > -1) { if (printing != pr_none) pr_number(num[i].infoname, num[i].capname, num[i].fullname, numval); if (common && (num[i].val == numval)) (void) printf("\t%s= %d.\n", num[i].infoname, numval); } else if (neither && (num[i].val == -1)) (void) printf("\t!%s.\n", num[i].infoname); if (diff && (num[i].val != numval)) (void) printf("\t%s: %d:%d.\n", num[i].infoname, num[i].val, numval); if (verbose) (void) fprintf(trace, "%s: %d:%d, " "changed = %d, seen = %d.\n", num[i].infoname, num[i].val, numval, num[i].changed, num[i].seenagain); } if (printing != pr_none) { if (printing == pr_cap) pr_ncaps(); pr_nfooting(); pr_sheading(); } if (diff || common || neither) (void) printf(" comparing strings.\n"); for (i = 0; i < numstrs; i++) { strval = tgetstr(str[i].capname, (char **)0); if (use) { if (str[i].seenagain && (strval != NULL)) { if (!EQUAL(strval, str[i].secondval)) { (void) fprintf(stderr, "use= order dependency" " found:\n"); (void) fprintf(stderr, " %s: %s has '", str[i].capname, str[i].secondname); PR(stderr, str[i].secondval); (void) fprintf(stderr, "', %s has '", nterm); PR(stderr, strval); (void) fprintf(stderr, "'.\n"); } } else { if (strval != NULL) { str[i].seenagain = TRUE; str[i].secondval = strval; str[i].secondname = nterm; if (!EQUAL(str[i].val, strval)) str[i].changed = TRUE; else used[n] = TRUE; } } } if (strval != NULL) { if (printing != pr_none) pr_string(str[i].infoname, str[i].capname, str[i].fullname, strval); if (common && EQUAL(str[i].val, strval)) { (void) printf("\t%s= '", str[i].infoname); PR(stdout, strval); (void) printf("'.\n"); } } else if (neither && (str[i].val == NULL)) (void) printf("\t!%s.\n", str[i].infoname); if (diff && !EQUAL(str[i].val, strval)) { (void) printf("\t%s: '", str[i].infoname); PR(stdout, str[i].val); (void) printf("','"); PR(stdout, strval); (void) printf("'.\n"); } if (verbose) { (void) fprintf(trace, "%s: '", str[i].infoname); PR(trace, str[i].val); (void) fprintf(trace, "':'"); PR(trace, strval); (void) fprintf(trace, "',changed=%d,seen=%d.\n", str[i].changed, str[i].seenagain); } } if (printing == pr_cap) pr_scaps(); if (printing != pr_none) pr_sfooting(); return; }
/* Set up the first terminal and save the values from it. */ void initfirstterm(char *term) { register int i; if (verbose) (void) fprintf(trace, "setting up terminal type '%s'.\n", term); (void) setupterm(term, devnull, (int *) 0); /* Save the name for later use. */ if (use) { register unsigned int length; savettytype = _savettytype; if ((length = strlen(ttytype)) >= TTYLEN) { savettytype = malloc(length); if (savettytype == NULL) { (void) fprintf(stderr, "%s: malloc is out " "of space\n", progname); (void) strncpy(_savettytype, ttytype, TTYLEN-1); _savettytype[TTYLEN] = '\0'; savettytype = _savettytype; } } else (void) strcpy(_savettytype, ttytype); } if (printing != pr_none) { pr_heading(term, ttytype); pr_bheading(); } /* Save the values for the first terminal. */ for (i = 0; i < numbools; i++) { if ((ibool[i].val = tgetflag(ibool[i].capname)) && printing != pr_none) pr_boolean(ibool[i].infoname, ibool[i].capname, ibool[i].fullname, 1); if (verbose) (void) fprintf(trace, "%s=%d.\n", ibool[i].infoname, ibool[i].val); } if (printing != pr_none) { if (printing == pr_cap) pr_bcaps(); pr_bfooting(); pr_nheading(); } for (i = 0; i < numnums; i++) { if (((num[i].val = tgetnum(num[i].capname)) > -1) && printing != pr_none) pr_number(num[i].infoname, num[i].capname, num[i].fullname, num[i].val); if (verbose) (void) fprintf(trace, "%s=%d.\n", num[i].infoname, num[i].val); } if (printing != pr_none) { if (printing == pr_cap) pr_ncaps(); pr_nfooting(); pr_sheading(); } for (i = 0; i < numstrs; i++) { str[i].val = tgetstr(str[i].capname, (char **)0); if ((str[i].val != NULL) && printing != pr_none) pr_string(str[i].infoname, str[i].capname, str[i].fullname, str[i].val); if (verbose) { (void) fprintf(trace, "%s='", str[i].infoname); PR(trace, str[i].val); (void) fprintf(trace, "'.\n"); } } if (printing == pr_cap) pr_scaps(); if (printing != pr_none) pr_sfooting(); }
void pr_ko() { if (kncounter > 0) pr_string((char *)0, "ko", (char *)0, kobuffer); }