diff options
author | Bruce Evans <bde@FreeBSD.org> | 2006-04-30 01:39:46 +0000 |
---|---|---|
committer | Bruce Evans <bde@FreeBSD.org> | 2006-04-30 01:39:46 +0000 |
commit | 4545c62547a98e7143f9111afdad0d3355e8dee5 (patch) | |
tree | 764f86128eed21c45623b4340b3d7f78dd74f7a9 /usr.bin/systat/vmstat.c | |
parent | 18d3a03e137cb205268efb7309ebe0bc8692b3e7 (diff) | |
download | src-4545c62547a98e7143f9111afdad0d3355e8dee5.tar.gz src-4545c62547a98e7143f9111afdad0d3355e8dee5.zip |
Edit the interrupt name strings to shorten them. This is believed to
only affect amd64 and i386. alpha uses "intr N" instead of "irqN" and
mostly has no device names. ia64 uses only device names.
- Edit interrupt names once after they are read from the kernel and not
every time they are displayed.
- Discard bogus trailing spaces so that the next step doesn't move things
to oblivion.
- If an interrupt name starts with "irqN:" (as it usually does in on
amd64 and i386), then move "irqN" to the end and strip ":", since we
have no space for the ":" and don't want to start descriptions with
"N" after stripping "irq" in the next step (since "N" would look like
a count). This step may need reworking for interrupt names containing
several device names -- then moving the irq number to the end would
lose it instead of losing some device names.
- Remove "irq" from an interrupt name if and only if the original name is
too long to display.
Notes
Notes:
svn path=/head/; revision=158154
Diffstat (limited to 'usr.bin/systat/vmstat.c')
-rw-r--r-- | usr.bin/systat/vmstat.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/usr.bin/systat/vmstat.c b/usr.bin/systat/vmstat.c index 20583c94eea9..4e0d59bd1fee 100644 --- a/usr.bin/systat/vmstat.c +++ b/usr.bin/systat/vmstat.c @@ -207,7 +207,7 @@ closekre(w) int initkre() { - char *intrnamebuf, *cp; + char *cp, *cp1, *cp2, *intrnamebuf, *nextcp; int i; size_t sz; @@ -249,8 +249,39 @@ initkre() return(0); } for (cp = intrnamebuf, i = 0; i < nintr; i++) { + nextcp = cp + strlen(cp) + 1; + + /* Discard trailing spaces. */ + for (cp1 = nextcp - 1; cp1 > cp && *(cp1 - 1) == ' '; ) + *--cp1 = '\0'; + + /* Convert "irqN: name" to "name irqN". */ + if (strncmp(cp, "irq", 3) == 0) { + cp1 = cp + 3; + while (isdigit((u_char)*cp1)) + cp1++; + if (cp1 != cp && *cp1 == ':' && + *(cp1 + 1) == ' ') { + *cp1 = '\0'; + cp1 = cp1 + 2; + cp2 = strdup(cp); + bcopy(cp1, cp, strlen(cp1) + 1); + strcat(cp, " "); + strcat(cp, cp2); + free(cp2); + } + } + + /* + * Convert "name irqN" to "name N" if the former is + * longer than the field width. + */ + if ((cp1 = strstr(cp, "irq")) != NULL && + strlen(cp) > 10) + bcopy(cp1 + 3, cp1, strlen(cp1 + 3) + 1); + intrname[i] = cp; - cp += strlen(cp) + 1; + cp = nextcp; } nextintsrow = INTSROW + 2; allocinfo(&s); |