Home | History | Annotate | Line # | Download | only in msgc
msgdb.c revision 1.19.2.1
      1  1.19.2.1      tron /*	$NetBSD: msgdb.c,v 1.19.2.1 2004/06/22 07:25:39 tron Exp $	*/
      2       1.1      phil 
      3       1.1      phil /*
      4       1.1      phil  * Copyright 1997 Piermont Information Systems Inc.
      5       1.1      phil  * All rights reserved.
      6       1.1      phil  *
      7       1.1      phil  * Written by Philip A. Nelson for Piermont Information Systems Inc.
      8       1.1      phil  *
      9       1.1      phil  * Redistribution and use in source and binary forms, with or without
     10       1.1      phil  * modification, are permitted provided that the following conditions
     11       1.1      phil  * are met:
     12       1.1      phil  * 1. Redistributions of source code must retain the above copyright
     13       1.1      phil  *    notice, this list of conditions and the following disclaimer.
     14       1.1      phil  * 2. Redistributions in binary form must reproduce the above copyright
     15       1.1      phil  *    notice, this list of conditions and the following disclaimer in the
     16       1.1      phil  *    documentation and/or other materials provided with the distribution.
     17       1.1      phil  * 3. All advertising materials mentioning features or use of this software
     18       1.1      phil  *    must display the following acknowledgement:
     19       1.1      phil  *      This product includes software develooped for the NetBSD Project by
     20       1.1      phil  *      Piermont Information Systems Inc.
     21       1.1      phil  * 4. The name of Piermont Information Systems Inc. may not be used to endorse
     22       1.1      phil  *    or promote products derived from this software without specific prior
     23       1.1      phil  *    written permission.
     24       1.1      phil  *
     25       1.1      phil  * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
     26       1.1      phil  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27       1.1      phil  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28       1.1      phil  * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
     29       1.1      phil  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30       1.1      phil  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31       1.1      phil  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32       1.1      phil  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33       1.1      phil  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34       1.1      phil  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     35       1.1      phil  * THE POSSIBILITY OF SUCH DAMAGE.
     36       1.1      phil  *
     37       1.1      phil  */
     38       1.1      phil 
     39       1.1      phil /* mdb.c - message database manipulation */
     40      1.16       agc 
     41  1.19.2.1      tron #if HAVE_NBTOOL_CONFIG_H
     42  1.19.2.1      tron #include "nbtool_config.h"
     43  1.19.2.1      tron #endif
     44  1.19.2.1      tron 
     45      1.16       agc #include <sys/cdefs.h>
     46      1.16       agc 
     47      1.18     lukem #if defined(__RCSID) && !defined(lint)
     48  1.19.2.1      tron __RCSID("$NetBSD: msgdb.c,v 1.19.2.1 2004/06/22 07:25:39 tron Exp $");
     49      1.16       agc #endif
     50      1.16       agc 
     51       1.1      phil 
     52       1.1      phil #include <stdio.h>
     53       1.1      phil #include <stdlib.h>
     54       1.2     enami #include <string.h>
     55       1.2     enami 
     56       1.1      phil #include "defs.h"
     57      1.12     bjh21 #include "pathnames.h"
     58       1.1      phil 
     59       1.1      phil static struct id_rec *head = NULL, *tail = NULL;
     60      1.15       dsl static int msg_no = 1;
     61       1.1      phil 
     62       1.1      phil void define_msg (char *name, char *value)
     63       1.1      phil {
     64       1.1      phil 	struct id_rec *tmp = (struct id_rec *)malloc(sizeof(struct id_rec));
     65       1.1      phil 
     66       1.1      phil 	if (find_id (root, name))
     67       1.1      phil 		yyerror ("%s is defined twice", name);
     68       1.1      phil 
     69       1.1      phil 	tmp->id     = name;
     70       1.1      phil 	tmp->msg    = value;
     71       1.1      phil 	tmp->msg_no = msg_no++;
     72       1.1      phil 	tmp->next   = NULL;
     73       1.1      phil 	if (tail == NULL)
     74       1.1      phil 		head = tail = tmp;
     75       1.1      phil 	else {
     76       1.1      phil 		tail->next = tmp;
     77       1.1      phil 		tail = tmp;
     78       1.1      phil 	}
     79       1.1      phil 
     80       1.1      phil 	insert_id (&root, tmp);
     81       1.1      phil }
     82       1.1      phil 
     83       1.1      phil static void write_str (FILE *f, char *str)
     84       1.1      phil {
     85       1.1      phil 	(void)fprintf (f, "\"");
     86       1.1      phil 	while (*str) {
     87       1.1      phil 		if (*str == '\n')
     88       1.1      phil 			(void) fprintf (f, "\\n\"\n\""), str++;
     89       1.1      phil 		else if (*str == '"')
     90       1.1      phil 			(void) fprintf (f, "\\\""), str++;
     91       1.1      phil 		else
     92       1.1      phil 			(void) fprintf (f, "%c", *str++);
     93       1.1      phil 	}
     94       1.1      phil 	(void)fprintf (f, "\",");
     95       1.1      phil }
     96       1.1      phil 
     97       1.1      phil /* Write out the msg files. */
     98       1.1      phil void
     99       1.1      phil write_msg_file ()
    100       1.1      phil {
    101       1.1      phil 	FILE *out_file;
    102       1.1      phil 	FILE *sys_file;
    103       1.1      phil 	char hname[1024];
    104       1.1      phil 	char cname[1024];
    105       1.1      phil 	char sname[1024];
    106       1.1      phil 	char *sys_prefix;
    107       1.1      phil 
    108       1.1      phil 	int nlen;
    109       1.1      phil 	int ch;
    110       1.1      phil 
    111       1.1      phil 	struct id_rec *t;
    112       1.1      phil 
    113       1.1      phil 	/* Generate file names */
    114       1.1      phil 	snprintf (hname, 1024, "%s.h", out_name);
    115       1.1      phil 	nlen = strlen(hname);
    116       1.1      phil 	if (hname[nlen-2] != '.' || hname[nlen-1] != 'h') {
    117       1.1      phil 		(void) fprintf (stderr, "%s: name `%s` too long.\n",
    118       1.1      phil 				prog_name, out_name);
    119       1.1      phil 		exit(1);
    120       1.1      phil 	}
    121       1.1      phil 	snprintf (cname, 1024, "%s.c", out_name);
    122       1.1      phil 
    123       1.1      phil 	/* Open the msg_sys file first. */
    124       1.1      phil 	sys_prefix = getenv ("MSGDEF");
    125       1.1      phil 	if (sys_prefix == NULL)
    126      1.12     bjh21 		sys_prefix = _PATH_DEFSYSPREFIX;
    127       1.1      phil 	snprintf (sname, 1024, "%s/%s", sys_prefix, sys_name);
    128       1.1      phil 	sys_file = fopen (sname, "r");
    129       1.1      phil 	if (sys_file == NULL) {
    130       1.1      phil 		(void) fprintf (stderr, "%s: could not open %s.\n",
    131       1.1      phil 				prog_name, sname);
    132       1.1      phil 		exit (1);
    133       1.1      phil 	}
    134       1.1      phil 
    135       1.1      phil 	/* Output the .h file first. */
    136       1.1      phil 	out_file = fopen (hname, "w");
    137       1.1      phil 	if (out_file == NULL) {
    138       1.1      phil 		(void) fprintf (stderr, "%s: could not open %s.\n",
    139       1.1      phil 				prog_name, hname);
    140       1.1      phil 		exit (1);
    141       1.1      phil 	}
    142       1.1      phil 
    143       1.1      phil 	/* Write it */
    144       1.1      phil 	(void) fprintf (out_file, "%s",
    145       1.1      phil 		"/* msg system definitions. */\n"
    146       1.1      phil 		"\n"
    147       1.1      phil 		"#ifndef MSG_DEFS_H\n"
    148       1.1      phil 		"#define MSG_DEFS_H\n"
    149       1.1      phil 		"#include <stdio.h>\n"
    150       1.4       cgd 		"#include <stdlib.h>\n"
    151      1.17       dsl 		"#include <unistd.h>\n"
    152      1.17       dsl 		"#include <fcntl.h>\n"
    153       1.1      phil 		"#include <string.h>\n"
    154       1.1      phil 		"#include <ctype.h>\n"
    155       1.1      phil 		"#include <stdarg.h>\n"
    156      1.13  christos 		"#include <stdint.h>\n"
    157       1.1      phil 		"#include <curses.h>\n"
    158      1.17       dsl 		"#include <sys/mman.h>\n"
    159       1.1      phil 		"\n"
    160      1.10       cgd 		"typedef const char *msg;\n"
    161      1.10       cgd 		"\n"
    162       1.1      phil 		"/* Prototypes */\n"
    163      1.15       dsl 		"WINDOW *msg_window(WINDOW *window);\n"
    164      1.17       dsl 		"const char *msg_string(msg msg_no);\n"
    165      1.17       dsl 		"int msg_file(const char *);\n"
    166       1.1      phil 		"void msg_clear(void);\n"
    167       1.1      phil 		"void msg_standout(void);\n"
    168       1.1      phil 		"void msg_standend(void);\n"
    169      1.10       cgd 		"void msg_display(msg msg_no,...);\n"
    170      1.10       cgd 		"void msg_display_add(msg msg_no,...);\n"
    171      1.10       cgd 		"void msg_prompt (msg msg_no, const char *def,"
    172      1.13  christos 			" char *val, size_t max_chars, ...);\n"
    173      1.10       cgd 		"void msg_prompt_add (msg msg_no, const char *def,"
    174      1.13  christos 			" char *val, size_t max_chars, ...);\n"
    175      1.10       cgd 		"void msg_prompt_noecho (msg msg_no, const char *def,"
    176      1.13  christos 			" char *val, size_t max_chars, ...);\n"
    177      1.15       dsl 		"void msg_prompt_win (msg, int, int, int, int,"
    178      1.14       dsl 			" const char *, char *, size_t, ...);\n"
    179      1.10       cgd 		"void msg_table_add(msg msg_no,...);\n"
    180      1.19       dsl 		"int msg_row(void);\n"
    181       1.1      phil 		"\n"
    182       1.1      phil 		"/* Message names */\n"
    183       1.1      phil 	      );
    184      1.10       cgd 	(void) fprintf (out_file, "#define MSG_NONE\tNULL\n");
    185       1.1      phil 	for (t=head; t != NULL; t = t->next) {
    186      1.10       cgd 		(void) fprintf (out_file, "#define MSG_%s\t((msg)(long)%d)\n",
    187       1.1      phil 				t->id, t->msg_no);
    188       1.1      phil 	}
    189       1.5       cgd 	(void) fprintf (out_file, "\n#endif\n");
    190       1.1      phil 
    191       1.1      phil 	fclose (out_file);
    192       1.1      phil 
    193       1.1      phil 	/* Now the C file */
    194       1.1      phil 	out_file = fopen (cname, "w");
    195       1.1      phil 	if (out_file == NULL) {
    196       1.1      phil 		(void) fprintf (stderr, "%s: could not open %s.\n",
    197       1.1      phil 				prog_name, cname);
    198       1.1      phil 		exit (1);
    199       1.1      phil 	}
    200       1.1      phil 
    201       1.1      phil 	/* hfile include ... */
    202       1.1      phil 	(void)fprintf (out_file, "#include \"%s\"\n", hname);
    203       1.1      phil 
    204       1.1      phil 	/* msg_list */
    205      1.15       dsl 	(void)fprintf (out_file, "const char *msg_list[] = {\nNULL,\n");
    206       1.1      phil 	for (t=head ; t != NULL; t = t->next)
    207       1.1      phil 		write_str (out_file, t->msg);
    208       1.1      phil 	(void)fprintf (out_file, "NULL};\n");
    209       1.1      phil 
    210       1.1      phil 	/* sys file out! */
    211       1.1      phil 	while ((ch = fgetc(sys_file)) != EOF)
    212       1.1      phil 		fputc(ch, out_file);
    213       1.1      phil 
    214       1.1      phil 	fclose (out_file);
    215       1.1      phil 	fclose (sys_file);
    216       1.1      phil }
    217