Files
nv-xconfig/nvidia-xconfig-540.3.0/common-utils/msg.c
svcmobrel-release b16ce48c94 Updating prebuilts and/or headers
6f6f68f976250f2646450e571f9ab2d7eee1ac80 - nvidia-xconfig-540.3.0/nvidia-cfg.h
46f2ea329459b0b16cb36cc14cec0de737d0963e - nvidia-xconfig-540.3.0/options.c
9b0c02164398be2795fea7cb13c9e1b062d24bfb - nvidia-xconfig-540.3.0/query_gpu_info.c
b1bc157844c5570f911b2bf45249bd26ce73efef - nvidia-xconfig-540.3.0/Makefile
10edc2c301fd331439b38d001c0df41669c238b2 - nvidia-xconfig-540.3.0/multiple_screens.c
f14e9577e537037d4778d490ef70f13b0e94a70a - nvidia-xconfig-540.3.0/option_table.h
1e39095238886dfc6a69f7ec750e10c05a93e7d1 - nvidia-xconfig-540.3.0/nvidia-xconfig.1.m4
913b088cb559f31e09a1baf89d85d75cb43079b4 - nvidia-xconfig-540.3.0/nvidia-xconfig.h
647e7896275a1113ec99352d573823a05001f57e - nvidia-xconfig-540.3.0/lscf.c
bfa37f78ba458f14a1865bbf3f67eb84987a7e1c - nvidia-xconfig-540.3.0/extract_edids.c
41bcac41393c9a465c30c07cf1ab386647a16687 - nvidia-xconfig-540.3.0/util.c
a5ad539267b73169480e7898b284823639c4db3a - nvidia-xconfig-540.3.0/tree.c
4cc77b90af91e615a64ae04893fdffa7939db84c - nvidia-xconfig-540.3.0/COPYING
c946eefad99cec9366d8abbd4e45c5d138d3b7be - nvidia-xconfig-540.3.0/make_usable.c
d37da5a118e0418b267a48d05fd144611316b42c - nvidia-xconfig-540.3.0/gen-manpage-opts.c
b3d0f9f27c4d9cb7940d04e1dd387d357a16024c - nvidia-xconfig-540.3.0/nvidia-xconfig.c
524990f5497f9bbeb3d148b5e7dc8d2267c3163d - nvidia-xconfig-540.3.0/common-utils/nvpci-utils.c
abb5c1b445d9353f2d2840bda848cd16109710a4 - nvidia-xconfig-540.3.0/common-utils/msg.h
1654638c567bc7f2bd70b54d807b498ab14c1061 - nvidia-xconfig-540.3.0/common-utils/nvpci-utils.h
8a346196b052cfb1e06dd83d2ad1fe71e928d2b3 - nvidia-xconfig-540.3.0/common-utils/common-utils.c
e572cac43202f6c2af1c80b9e3901215126093ed - nvidia-xconfig-540.3.0/common-utils/nvgetopt.h
8db48a58d1654ed69920366bef10f38b789a1a84 - nvidia-xconfig-540.3.0/common-utils/msg.c
8259a24058c714629f9819cc8c830ea9b202bb27 - nvidia-xconfig-540.3.0/common-utils/gen-manpage-opts-helper.h
5d55b94375c2055cfa1578e4c7f34c90e63a33f7 - nvidia-xconfig-540.3.0/common-utils/gen-manpage-opts-helper.c
dc2678d8a9d794a4b2b2718fce57ec087f21f54b - nvidia-xconfig-540.3.0/common-utils/common-utils.h
384e36102dcd08ed4c5de05b5e3b8a7cdb2e257d - nvidia-xconfig-540.3.0/common-utils/nvgetopt.c
33211ca0a10f50e2c87b9e8feef6c1ab381b57a1 - nvidia-xconfig-540.3.0/XF86Config-parser/DRI.c
5ffb2caa5077a2e6ec1c5ece807e71503fb2fbce - nvidia-xconfig-540.3.0/XF86Config-parser/Module.c
953b945f3b117d6fb44f1f738af17b6380a9ec72 - nvidia-xconfig-540.3.0/XF86Config-parser/Monitor.c
de1c758e29f217e1a99e4c076d54ac84bce98b18 - nvidia-xconfig-540.3.0/XF86Config-parser/Screen.c
f3d611bdbddfa64675a0810ef81dada57e224bcd - nvidia-xconfig-540.3.0/XF86Config-parser/Extensions.c
ec19d673a6a7d1d8f855f2d32d3e8f63046c3625 - nvidia-xconfig-540.3.0/XF86Config-parser/Files.c
e67d630ef396ab7d34524c333f3a77fc42ba8fc6 - nvidia-xconfig-540.3.0/XF86Config-parser/configProcs.h
c66a0a141e25e31b568fb9df41f17d7fb9e6d3b9 - nvidia-xconfig-540.3.0/XF86Config-parser/xf86Parser.h
4d9b03ea3badceb6bdfdf6589e6731140ec44079 - nvidia-xconfig-540.3.0/XF86Config-parser/Generate.c
cda3a4ab05bf48ba28af35b5c4c632e968afc7fa - nvidia-xconfig-540.3.0/XF86Config-parser/Util.c
83b0a8efd6a508db54995688ab353591bdb242a2 - nvidia-xconfig-540.3.0/XF86Config-parser/Flags.c
45ceb0129668346ae3e52d81bb6e2f97efadf9d0 - nvidia-xconfig-540.3.0/XF86Config-parser/Input.c
18711ff932af2202869a30f3b32d6d7fe7811c84 - nvidia-xconfig-540.3.0/XF86Config-parser/Layout.c
c7b8d8ca0f7c9dcc2cdca4f8e77d1122c71892ef - nvidia-xconfig-540.3.0/XF86Config-parser/Read.c
0a274c4bc54b6ae0f6d009e443bda0cb033d66b5 - nvidia-xconfig-540.3.0/XF86Config-parser/Pointer.c
04efe162cf6d97882f2bb87f3712d9a65c2320f3 - nvidia-xconfig-540.3.0/XF86Config-parser/Scan.c
7344be997921dec57959691e986763ee686888d5 - nvidia-xconfig-540.3.0/XF86Config-parser/Device.c
4407207cf890539dc604cff5b834c994b307729a - nvidia-xconfig-540.3.0/XF86Config-parser/Write.c
3f2238c88d737bd329a9bca1ac4b0bcf77bb9ac2 - nvidia-xconfig-540.3.0/XF86Config-parser/xf86tokens.h
a9bc06f33bf525c2b08be2dc3cd64a59c4c7946d - nvidia-xconfig-540.3.0/XF86Config-parser/Configint.h
9cbc29da282aa957f28b7fc83caf1e3b19ee2a52 - nvidia-xconfig-540.3.0/XF86Config-parser/Vendor.c
2022a4a3c2a1b23a67ae74f50a3849f5f3a45e4b - nvidia-xconfig-540.3.0/XF86Config-parser/Keyboard.c
6c210ad0eaee1db3fec48ff01746cb054b4f9aaa - nvidia-xconfig-540.3.0/XF86Config-parser/Video.c
ac878b26ded86a3c502a6a81fc4c4a96162afefb - nvidia-xconfig-540.3.0/XF86Config-parser/Merge.c

Change-Id: I3be9db5329476f82eb30f69e29fb957c39267004
2024-05-02 11:24:17 -07:00

429 lines
10 KiB
C

/*
* Copyright (C) 2004 NVIDIA Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#define _GNU_SOURCE // needed for fileno
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#if defined(__sun)
#include <sys/termios.h>
#endif
#include "msg.h"
#include "common-utils.h"
/*
* verbosity, controls output of errors, warnings and other
* information.
*/
static NvVerbosity __verbosity = NV_VERBOSITY_DEFAULT;
NvVerbosity nv_get_verbosity(void)
{
return __verbosity;
}
void nv_set_verbosity(NvVerbosity level)
{
__verbosity = level;
}
/****************************************************************************/
/* Formatted I/O functions */
/****************************************************************************/
#define DEFAULT_WIDTH 75
static unsigned short __terminal_width = 0;
/*
* reset_current_terminal_width() - if new_val is zero, then use the
* TIOCGWINSZ ioctl to get the current width of the terminal, and
* assign it the value to __terminal_width. If the ioctl fails, use a
* hardcoded constant. If new_val is non-zero, then use new_val.
*/
void reset_current_terminal_width(unsigned short new_val)
{
struct winsize ws;
if (new_val) {
__terminal_width = new_val;
return;
}
if (ioctl(STDERR_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) {
__terminal_width = DEFAULT_WIDTH;
} else {
__terminal_width = ws.ws_col - 1;
}
}
static void format(FILE *stream, const char *prefix, const char *buf,
const int whitespace)
{
if (isatty(fileno(stream))) {
int i;
TextRows *t;
if (!__terminal_width) reset_current_terminal_width(0);
t = nv_format_text_rows(prefix, buf, __terminal_width, whitespace);
for (i = 0; i < t->n; i++) fprintf(stream, "%s\n", t->t[i]);
nv_free_text_rows(t);
} else {
fprintf(stream, "%s%s\n", prefix ? prefix : "", buf);
}
}
#define NV_FORMAT(stream, prefix, fmt, whitespace) \
do { \
char *buf; \
NV_VSNPRINTF(buf, fmt); \
format(stream, prefix, buf, whitespace); \
free (buf); \
} while (0)
/*
* nv_error_msg() - print an error message, nicely formatted using the
* format() function.
*
* This function should be used for all errors.
*/
void nv_error_msg(const char *fmt, ...)
{
if (__verbosity < NV_VERBOSITY_ERROR) return;
format(stderr, NULL, "", TRUE);
NV_FORMAT(stderr, "ERROR: ", fmt, TRUE);
format(stderr, NULL, "", TRUE);
} /* nv_error_msg() */
/*
* nv_deprecated_msg() - print a deprecation message, nicely formatted using
* the format() function.
*
* This function should be used for all deprecation messages.
*/
void nv_deprecated_msg(const char *fmt, ...)
{
if (__verbosity < NV_VERBOSITY_DEPRECATED) return;
format(stderr, NULL, "", TRUE);
NV_FORMAT(stderr, "DEPRECATED: ", fmt, TRUE);
format(stderr, NULL, "", TRUE);
}
/*
* nv_warning_msg() - print a warning message, nicely formatted using
* the format() function.
*
* This function should be used for all warnings.
*/
void nv_warning_msg(const char *fmt, ...)
{
if (__verbosity < NV_VERBOSITY_WARNING) return;
format(stderr, NULL, "", TRUE);
NV_FORMAT(stderr, "WARNING: ", fmt, TRUE);
format(stderr, NULL, "", TRUE);
} /* nv_warning_msg() */
/*
* nv_info_msg() - print an info message, nicely formatted using
* the format() function.
*
* This function should be used to display verbose information.
*/
void nv_info_msg(const char *prefix, const char *fmt, ...)
{
if (__verbosity < NV_VERBOSITY_ALL) return;
NV_FORMAT(stdout, prefix, fmt, TRUE);
} /* nv_info_msg() */
/*
* nv_info_msg_to_file() - Prints the message, just like nv_info_msg()
* using format() the difference is, it prints to any stream defined by
* the corresponding argument.
*/
void nv_info_msg_to_file(FILE *stream, const char *prefix, const char *fmt, ...)
{
if (__verbosity < NV_VERBOSITY_ALL) return;
NV_FORMAT(stream, prefix, fmt, TRUE);
} /* nv_info_msg_to_file() */
/*
* nv_msg() - print a message, nicely formatted using the format()
* function.
*
* This function should be used to display messages independent
* of the verbosity level.
*/
void nv_msg(const char *prefix, const char *fmt, ...)
{
NV_FORMAT(stdout, prefix, fmt, TRUE);
} /* nv_msg() */
/*
* nv_msg_preserve_whitespace() - Prints the message, just like nv_msg()
* using format(), the difference is, whitespace characters are not
* skipped during the text processing.
*/
void nv_msg_preserve_whitespace(const char *prefix, const char *fmt, ...)
{
NV_FORMAT(stdout, prefix, fmt, FALSE);
} /* nv_msg_preserve_whitespace() */
/*
* XXX gcc's '-ansi' option causes vsnprintf to not be defined, so
* declare the prototype here.
*/
#if defined(__STRICT_ANSI__)
int vsnprintf(char *str, size_t size, const char *format,
va_list ap);
#endif
/****************************************************************************/
/* TextRows helper functions */
/****************************************************************************/
/*
* nv_format_text_rows() - this function breaks the given string str
* into some number of rows, where each row is not longer than the
* specified width.
*
* If prefix is non-NULL, the first line is prepended with the prefix,
* and subsequent lines are indented to line up with the prefix.
*
* If word_boundary is TRUE, then attempt to only break lines on
* boundaries between words.
*/
TextRows *nv_format_text_rows(const char *prefix, const char *str, int width,
int word_boundary)
{
int len, prefix_len, z, w, i;
char *line, *buf, *local_prefix, *a, *b, *c;
TextRows *t;
/* initialize the TextRows structure */
t = (TextRows *) malloc(sizeof(TextRows));
if (!t) return NULL;
t->t = NULL;
t->n = 0;
t->m = 0;
if (!str) return t;
buf = strdup(str);
if (!buf) return t;
z = strlen(buf); /* length of entire string */
a = buf; /* pointer to the start of the string */
/* initialize the prefix fields */
if (prefix) {
prefix_len = strlen(prefix);
local_prefix = strdup(prefix);
} else {
prefix_len = 0;
local_prefix = NULL;
}
/* adjust the max width for any prefix */
w = width - prefix_len;
do {
/*
* if the string will fit on one line, point b to the end of the
* string
*/
if (z < w) b = a + z;
/*
* if the string won't fit on one line, move b to where the
* end of the line should be, and then move b back until we
* find a space; if we don't find a space before we back b all
* the way up to a, just assign b to where the line should end.
*/
else {
b = a + w;
if (word_boundary) {
while ((b >= a) && (!isspace(*b))) b--;
if (b <= a) b = a + w;
}
}
/* look for any newline between a and b, and move b to it */
for (c = a; c < b; c++) if (*c == '\n') { b = c; break; }
/*
* copy the string that starts at a and ends at b, prepending
* with a prefix, if present
*/
len = b-a;
len += prefix_len;
line = (char *) malloc(len+1);
if (local_prefix) strncpy(line, local_prefix, prefix_len);
strncpy(line + prefix_len, a, len - prefix_len);
line[len] = '\0';
/* append the new line to the array of text rows */
t->t = (char **) realloc(t->t, sizeof(char *) * (t->n + 1));
t->t[t->n] = line;
t->n++;
if (t->m < len) t->m = len;
/*
* adjust the length of the string and move the pointer to the
* beginning of the new line
*/
z -= (b - a + 1);
a = b + 1;
/* move to the first non whitespace character (excluding newlines) */
if (word_boundary && isspace(*b)) {
while ((z) && (isspace(*a)) && (*a != '\n')) a++, z--;
} else {
if (!isspace(*b)) z++, a--;
}
if (local_prefix) {
for (i = 0; i < prefix_len; i++) local_prefix[i] = ' ';
}
} while (z > 0);
if (local_prefix) free(local_prefix);
free(buf);
return t;
}
/*
* nv_text_rows_append() - append the given msg to the existing TextRows
*/
void nv_text_rows_append(TextRows *t, const char *msg)
{
int len;
t->t = realloc(t->t, sizeof(char *) * (t->n + 1));
if (msg) {
t->t[t->n] = strdup(msg);
len = strlen(msg);
if (t->m < len) t->m = len;
} else {
t->t[t->n] = NULL;
}
t->n++;
}
/*
* nv_concat_text_rows() - concatenate two text rows, storing the
* result in t0
*/
void nv_concat_text_rows(TextRows *t0, TextRows *t1)
{
int n, i;
n = t0->n + t1->n;
t0->t = realloc(t0->t, sizeof(char *) * n);
for (i = 0; i < t1->n; i++) {
t0->t[i + t0->n] = strdup(t1->t[i]);
}
t0->m = NV_MAX(t0->m, t1->m);
t0->n = n;
} /* nv_concat_text_rows() */
/*
* nv_free_text_rows() - free the TextRows data structure allocated by
* nv_format_text_rows()
*/
void nv_free_text_rows(TextRows *t)
{
int i;
if (!t) return;
for (i = 0; i < t->n; i++) free(t->t[i]);
if (t->t) free(t->t);
free(t);
} /* nv_free_text_rows() */