示例#1
0
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 */
}
示例#2
0
/*
	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]);
}
示例#3
0
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();
}
示例#4
0
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);
}
示例#5
0
/* 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;
}
示例#6
0
/*
	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;
}
示例#7
0
/*
	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();
}
示例#8
0
void
pr_ko()
{
	if (kncounter > 0)
		pr_string((char *)0, "ko", (char *)0, kobuffer);
}