summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/comp/fmtmsglib.c
diff options
context:
space:
mode:
authorchin <none@none>2007-08-17 12:01:52 -0700
committerchin <none@none>2007-08-17 12:01:52 -0700
commitda2e3ebdc1edfbc5028edf1354e7dd2fa69a7968 (patch)
tree5280d3b78e289fe9551371ab6e7f15ef9944ea14 /usr/src/lib/libast/common/comp/fmtmsglib.c
parent073dbf9103ef2a2b05d8a16e2d26db04e0374b0e (diff)
downloadillumos-gate-da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968.tar.gz
6437624 RFE: Add ksh93 (as /usr/bin/ksh93) and libshell.so to OS/Net
6505835 AST tools and library (libpp) required for creating l10n messages for ksh93 PSARC/2006/550 Korn Shell 93 Integration PSARC/2006/587 /etc/ksh.kshrc for ksh93 PSARC/2007/035 ksh93 Amendments Contributed by Roland Mainz <roland.mainz@nrubsig.org> --HG-- rename : usr/src/lib/libcmd/common/mapfile-vers => deleted_files/usr/src/lib/libcmd/common/mapfile-vers rename : usr/src/lib/libcmd/common/placeholder.c => deleted_files/usr/src/lib/libcmd/common/placeholder.c
Diffstat (limited to 'usr/src/lib/libast/common/comp/fmtmsglib.c')
-rw-r--r--usr/src/lib/libast/common/comp/fmtmsglib.c335
1 files changed, 335 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/comp/fmtmsglib.c b/usr/src/lib/libast/common/comp/fmtmsglib.c
new file mode 100644
index 0000000000..6ae1fd1c83
--- /dev/null
+++ b/usr/src/lib/libast/common/comp/fmtmsglib.c
@@ -0,0 +1,335 @@
+/***********************************************************************
+* *
+* This software is part of the ast package *
+* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Knowledge Ventures *
+* *
+* A copy of the License is available at *
+* http://www.opensource.org/licenses/cpl1.0.txt *
+* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
+* *
+* Information and Software Systems Research *
+* AT&T Research *
+* Florham Park NJ *
+* *
+* Glenn Fowler <gsf@research.att.com> *
+* David Korn <dgk@research.att.com> *
+* Phong Vo <kpv@research.att.com> *
+* *
+***********************************************************************/
+#pragma prototyped
+/*
+ * fmtmsg implementation
+ */
+
+#include <ast.h>
+
+#if _lib_fmtmsg
+
+NoN(fmtmsg)
+
+#else
+
+#define MM_TABLES
+
+#include <fmtmsg.h>
+
+#define INIT_VERB 0x1
+#define INIT_CONSOLE 0x2
+
+static struct
+{
+ int console;
+ unsigned int init;
+ unsigned int mask;
+} mm;
+
+const MM_table_t mm_class[] =
+{
+ "null", 0, 0,
+ "hard", "HARDWARE", MM_HARD,
+ "soft", "SOFTWARE", MM_SOFT,
+ "firm", "FIRMWARE", MM_FIRM,
+ "appl", "APPLICATION", MM_APPL,
+ "util", "UTILITY", MM_UTIL,
+ "opsys", "KERNEL", MM_OPSYS,
+ "print", 0, MM_PRINT,
+ "console", 0, MM_CONSOLE,
+ "recov", "RECOVERABLE", MM_RECOVER,
+ "nrecov", "PANIC", MM_NRECOV,
+ 0, 0, 0
+};
+
+static const MM_table_t mm_severity_init[] =
+{
+ "nosev", 0, MM_NOSEV,
+ "halt", "HALT", MM_HALT,
+ "error", "ERROR", MM_ERROR,
+ "warn", "WARNING", MM_WARNING,
+ "info", "INFO", MM_INFO,
+ 0, 0, 0
+};
+
+const MM_table_t mm_verb[] =
+{
+ "all", 0, MM_all,
+ "action", 0, MM_action,
+ "class", 0, MM_class,
+ "default", 0, MM_default,
+ "label", 0, MM_label,
+ "severity", 0, MM_severity,
+ "source", 0, MM_source,
+ "tag", 0, MM_tag,
+ "text", 0, MM_text,
+ 0, 0, 0
+};
+
+const MM_table_t*
+_mm_severity(void)
+{
+ static MM_table_t* severity;
+
+ if (!severity)
+ {
+ register char* s;
+ register MM_table_t* p;
+ register int n;
+ register int c;
+ char* e;
+ MM_table_t* q;
+
+ n = 0;
+ if ((s = getenv(MM_SEVERITY_ENV)) && *s)
+ {
+ e = s;
+ c = 0;
+ for (;;)
+ {
+ switch (*s++)
+ {
+ case 0:
+ break;
+ case ',':
+ if (++c > 2)
+ {
+ n = 0;
+ break;
+ }
+ continue;
+ case ':':
+ if (c != 2)
+ {
+ n = 0;
+ break;
+ }
+ c = 0;
+ n++;
+ continue;
+ default:
+ continue;
+ }
+ break;
+ }
+ if (c == 2)
+ n++;
+ else n = 0;
+ if (n)
+ {
+ for (p = (MM_table_t*)mm_severity_init; p->name; p++);
+ n += p - (MM_table_t*)mm_severity_init + 1;
+ if (severity = newof(0, MM_table_t, n, s - e))
+ {
+ s = (char*)severity + n * sizeof(MM_table_t);
+ strcpy(s, e);
+ p = severity;
+ for (q = (MM_table_t*)mm_severity_init; q->name; q++)
+ *p++ = *q;
+ p->name = s;
+ c = 0;
+ for (;;)
+ {
+ switch (*s++)
+ {
+ case 0:
+ break;
+ case ',':
+ switch (c++)
+ {
+ case 0:
+ *(s - 1) = 0;
+ p->value = strtol(s, NiL, 0);
+ break;
+ case 1:
+ p->display = s;
+ break;
+ }
+ continue;
+ case ':':
+ c = 0;
+ *(s - 1) = 0;
+ (++p)->name = s;
+ continue;
+ default:
+ continue;
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (!severity)
+ severity = (MM_table_t*)mm_severity_init;
+ }
+ return (const MM_table_t*)severity;
+}
+
+static char*
+display(register const MM_table_t* tab, int value, int mask)
+{
+ while (tab->name)
+ {
+ if (value == tab->value || mask && (value & tab->value))
+ return (char*)tab->display;
+ tab++;
+ }
+ return 0;
+}
+
+int
+fmtmsg(long classification, const char* label, int severity, const char* text, const char* action, const char* tag)
+{
+ register int c;
+ register char* s;
+ register char* t;
+ register MM_table_t* p;
+ int n;
+ int m;
+ int r;
+ int fd;
+ unsigned int mask;
+ Sfio_t* sp;
+ char lab[MM_LABEL_1_MAX + MM_LABEL_2_MAX + 3];
+
+ if (!mm.init)
+ {
+ mm.init = INIT_VERB;
+ if (!(s = getenv(MM_VERB_ENV)))
+ mm.mask = MM_default;
+ else for (;;)
+ {
+ if (t = strchr(s, ':'))
+ *t = 0;
+ if (!(p = (MM_table_t*)strlook(mm_verb, sizeof(MM_table_t), s)))
+ {
+ mm.mask = MM_default;
+ if (t)
+ *t = ':';
+ break;
+ }
+ mm.mask |= p->value;
+ if (!t)
+ break;
+ *t++ = ':';
+ s = t;
+ }
+ }
+ if (!(classification & (MM_CONSOLE|MM_PRINT)))
+ return 0;
+ if (!(sp = sfstropen()))
+ return MM_NOTOK;
+ r = 0;
+ if (s = (char*)label)
+ {
+ if (t = strchr(s, ':'))
+ {
+ if ((n = t - s) > MM_LABEL_1_MAX)
+ n = MM_LABEL_1_MAX;
+ sfprintf(sp, "%*.*s:", n, n, s);
+ s = ++t;
+ if ((n = strlen(t)) > MM_LABEL_2_MAX)
+ n = MM_LABEL_2_MAX;
+ sfprintf(sp, "%*.*s", n, n, s);
+ }
+ else
+ {
+ if ((n = strlen(t)) > MM_LABEL_1_MAX)
+ n = MM_LABEL_1_MAX;
+ sfprintf(sp, "%*.*s", n, n, s);
+ }
+ if (!(s = sfstruse(sp)))
+ {
+ sfstrclose(sp);
+ return MM_NOTOK;
+ }
+ strcpy(lab, s);
+ }
+ for (;;)
+ {
+ if (classification & MM_CONSOLE)
+ {
+ classification &= ~MM_CONSOLE;
+ if (!(mm.init & INIT_CONSOLE))
+ mm.console = open("/dev/console", O_WRONLY|O_APPEND|O_NOCTTY);
+ if (mm.console < 0)
+ {
+ r |= MM_NOCON;
+ continue;
+ }
+ c = MM_NOCON;
+ fd = mm.console;
+ mask = MM_all;
+ }
+ else if (classification & MM_PRINT)
+ {
+ classification &= ~MM_PRINT;
+ c = MM_NOMSG;
+ fd = 2;
+ mask = mm.mask;
+ }
+ else break;
+ if ((mask & MM_label) && label)
+ sfprintf(sp, "%s: ", lab);
+ if ((mask & MM_severity) && (s = display(mm_severity, severity, 0)))
+ sfprintf(sp, "%s: ", s);
+ n = sfstrtell(sp);
+ if ((mask & MM_text) && text)
+ sfprintf(sp, "%s\n", text);
+ else sfputc(sp, '\n');
+ if ((mask & MM_action) && action || (mask & MM_tag) && (label || tag))
+ {
+ if (fd != mm.console && (n -= 8) > 0)
+ sfprintf(sp, "%*.*s", n, n, "");
+ sfprintf(sp, "TO FIX:");
+ if ((mask & MM_action) && action)
+ sfprintf(sp, " %s", action);
+ if ((mask & MM_tag) && (label || tag))
+ {
+ sfprintf(sp, " ");
+ if (!tag || label && !strchr(tag, ':'))
+ sfprintf(sp, "%s%s", lab, tag ? ":" : "");
+ if (tag)
+ sfprintf(sp, "%s", tag);
+ }
+ if (mask & (MM_class|MM_source|MM_status))
+ {
+ sfputc(sp, ' ');
+ if ((mask & MM_source) && (m = classification & (MM_APPL|MM_UTIL|MM_OPSYS)) && (s = display(mm_class, m, 1)))
+ sfprintf(sp, " %s", s);
+ if ((mask & MM_class) && (m = classification & (MM_HARD|MM_SOFT|MM_FIRM)) && (s = display(mm_class, m, 1)))
+ sfprintf(sp, " %s", s);
+ if ((mask & MM_status) && (m = classification & (MM_RECOVER|MM_NRECOV)) && (s = display(mm_class, m, 1)))
+ sfprintf(sp, " %s", s);
+ }
+ sfputc(sp, '\n');
+ }
+ n = sfstrtell(sp);
+ if (!(s = sfstruse(sp)) || write(fd, s, n) != n)
+ r |= c;
+ }
+ sfstrclose(sp);
+ return r;
+}
+
+#endif