util.c revision 6e54a631bc06b2a4f5919eb8d582d52780e17983
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The contents of this file are subject to the terms of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Common Development and Distribution License (the "License").
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You may not use this file except in compliance with the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * or http://www.opensolaris.org/os/licensing.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * When distributing Covered Code, include this CDDL HEADER in each
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If applicable, add the following below this CDDL HEADER, with the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fields enclosed by brackets "[]" replaced with your own identifying
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * information: Portions Copyright [yyyy] [name of copyright owner]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER END
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
e77b06d21580f630e0a7c437495ab283d3672828tomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#pragma ident "%Z%%M% %I% %E% SMI"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdio.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <limits.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdlib.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <string.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdarg.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <libintl.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <locale.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <libgen.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <ctype.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <unistd.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <signal.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <sys/types.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <sys/stat.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include "genmsg.h"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SET_TOKEN "$set"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define DELSET_TOKEN "$delset"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define QUOTE_TOKEN "$quote"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#define SkipSpace(s) while (*(s) == ' ' || *(s) == '\t') s++
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern char *program; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern char *mctag; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern char *sctag; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern char *premsg; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern char *sufmsg; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern int suppress_error; /* from main.c */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeextern void warning(char *); /* from genmsg.l */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct _SetID *SetID;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct _MsgID *MsgID;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct _SetID SetIDRec;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestruct _SetID {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int id;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *comment;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee};
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeetypedef struct _MsgID MsgIDRec;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestruct _MsgID {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int no_write;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int id;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *msg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int line;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *file;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *comment;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee};
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Top pointer of the setid list. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic SetID setid_top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* comment for messages. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char *msg_comment;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* comment for set numbers. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char *set_comment;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* List of set number's maximum message numbers. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int msgid_table[NL_SETMAX+1];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Quote character to surround messages. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char quote = QUOTE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Internal functions. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void add_msgid(SetID, int, char *, char *, int, int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void add_setid(int, int, char *, char *, int, int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic SetID lookup_setid(int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic MsgID lookup_msgid(SetID, int, char *, char *, int);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void print_prefix(FILE *, char *, int, char *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int is_bs_terminated(char *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char *ustrdup(char *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void makeup_msg(char **);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeadd_msg(int setid, int msgid, char *msg, char *file, int line, int no_write)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID si;
127bbe13a6d36580af6a8ded154f1201a6250772tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si = lookup_setid(setid)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (lookup_msgid(si, msgid, msg, file, line)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return; /* we already have the one. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee add_msgid(si, msgid, msg, file, line, no_write);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee add_setid(setid, msgid, msg, file, line, no_write);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeis_writable(char *file)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct stat buf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (stat(file, &buf) == -1)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (access(file, W_OK) == 0)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeewrite_msgfile(char *file)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee FILE *fp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID si = setid_top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *mode = "w";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char pquote[2];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (is_writable(file) == FALSE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("cannot create \"%s\": permission denied"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (IsActiveMode(AppendMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mode = "a";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fp = fopen(file, mode)) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("cannot create \"%s\""), file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (quote) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pquote[0] = quote;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pquote[0] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee pquote[1] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* AppendMode is already turned off if the file doesn't exist. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!IsActiveMode(AppendMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "\n$quote %s\n\n", pquote);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (si) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int is_set = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID mi = si->top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (mi) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char msg[NL_TEXTMAX+32]; /* 32 is some other stuff. */
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (mi->no_write) {
e77b06d21580f630e0a7c437495ab283d3672828tomee mi = mi->next;
e77b06d21580f630e0a7c437495ab283d3672828tomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (is_set == FALSE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si->comment &&
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee !IsActiveMode(BackCommentMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "\n");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "$ ", TRUE,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "$set\t%d\n",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "\n$set\t%d\n",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si->comment &&
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee IsActiveMode(BackCommentMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "$ ", TRUE,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "\n");
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe is_set = TRUE;
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe }
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe makeup_msg(&(mi->msg));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) snprintf(msg, sizeof (msg), "%d\t%s%s%s\n",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi->id, pquote, mi->msg, pquote);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (!IsActiveMode(BackCommentMode)) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (mi->line && mi->file &&
127bbe13a6d36580af6a8ded154f1201a6250772tomee IsActiveMode(LineInfoMode)) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee (void) fprintf(fp,
127bbe13a6d36580af6a8ded154f1201a6250772tomee "$ File:%s, line:%d\n",
127bbe13a6d36580af6a8ded154f1201a6250772tomee basename(mi->file), mi->line);
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (mi->comment) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee print_prefix(fp, "$ ", TRUE,
127bbe13a6d36580af6a8ded154f1201a6250772tomee mi->comment);
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (IsActiveMode(DoubleLineMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "$ ", FALSE, msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee (void) fprintf(fp, "%s", msg);
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (IsActiveMode(BackCommentMode)) {
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee if (mi->line && mi->file &&
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee IsActiveMode(LineInfoMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "$ File:%s, line:%d\n",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee basename(mi->file), mi->line);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (mi->comment) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "$ ", TRUE,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi->comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (IsActiveMode(DoubleLineMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "$ ", FALSE, msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "\n");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi = mi->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si = si->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic SetID
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeelookup_setid(int id)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID si = setid_top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (si) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si->id == id) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (si);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si = si->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic MsgID
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeelookup_msgid(SetID si, int msgid, char *msg, char *file, int line)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID mi = si->top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (mi) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (mi->id == msgid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* same setid & msgid, but different msg. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strcmp(mi->msg, msg)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee src_err(file, line, gettext(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "multiple messages: set number %d, message number %d\n"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee " current : \"%s\"\n"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee " previous: \"%s\" : \"%s\", line %d"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->id, mi->id,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi->msg, mi->file, mi->line);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (mi);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi = mi->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeadd_msgid(SetID si, int msgid, char *msg, char *file, int line, int no_write)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID mi = si->top, newmi, prev = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msgid == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee src_err(file, line, gettext("improper message number: %d"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msgid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msgid > NL_MSGMAX) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee src_err(file, line, gettext("too large message number: %d"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msgid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (len > NL_TEXTMAX) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee src_err(file, line, gettext("too long message text"));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (mi) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (mi->id > msgid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prev = mi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi = mi->next;
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((newmi = malloc(sizeof (MsgIDRec))) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("fatal: out of memory"));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee exit(EXIT_FAILURE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee newmi->no_write = no_write;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->id = msgid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->msg = ustrdup(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->file = ustrdup(file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->line = line;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->next = mi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msg_comment) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->comment = ustrdup(msg_comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(msg_comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg_comment = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newmi->comment = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (prev == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si->top = newmi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prev->next = newmi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeadd_setid(int setid, int msgid, char *msg, char *file, int line, int no_write)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID si = setid_top, newsi, prev = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (si) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si->id > setid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prev = si;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si = si->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((newsi = malloc(sizeof (SetIDRec))) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("fatal: out of memory"));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee exit(EXIT_FAILURE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newsi->id = setid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newsi->top = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newsi->next = si;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (set_comment) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newsi->comment = ustrdup(set_comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(set_comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee set_comment = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee newsi->comment = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (prev == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee setid_top = newsi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prev->next = newsi;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee add_msgid(newsi, msgid, msg, file, line, no_write);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeprint_prefix(FILE *fp, char *prefix, int rm_blank, char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "%s", prefix);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (*str) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fputc(*str, fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*str == '\n' && *(str+1) != '\0') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(fp, "%s", prefix);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (rm_blank == TRUE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee str++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SkipSpace(str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee str++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*(str-1) != '\n') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fputc('\n', fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeread_projfile(char *file)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee FILE *fp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char line[LINE_MAX];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (file == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fp = fopen(file, "r")) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee while (fgets(line, sizeof (line), fp) != NULL) {
e77b06d21580f630e0a7c437495ab283d3672828tomee char *p = line;
e77b06d21580f630e0a7c437495ab283d3672828tomee int n, setid, msgid;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee SkipSpace(p);
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*p == '#' || *p == '\n') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee n = sscanf(p, "%d %d", &setid, &msgid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (n == 2) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (setid > NL_SETMAX) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("%s: too large set number: %d"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee file, setid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msgid_table[setid] = msgid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext(
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "warning: %s: missing or invalid entry"), file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeewrite_projfile(char *file)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe FILE *fp;
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe register int i;
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe if (is_writable(file) == FALSE) {
ae94d716ff8759d2dc2de680b5b85a291219a4c1Richard Lowe prg_err(gettext("cannot create \"%s\": permission denied"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fp = fopen(file, "w")) == NULL) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee prg_err(gettext("cannot create \"%s\""), file);
127bbe13a6d36580af6a8ded154f1201a6250772tomee return;
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee for (i = 1; i <= NL_SETMAX; i++) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (msgid_table[i] > 0) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee SetID si;
127bbe13a6d36580af6a8ded154f1201a6250772tomee char *com = NULL;
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (IsActiveMode(SetCommentMode) &&
127bbe13a6d36580af6a8ded154f1201a6250772tomee (si = lookup_setid(i)) && si->comment) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee com = si->comment;
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee if (com && !IsActiveMode(BackCommentMode)) {
127bbe13a6d36580af6a8ded154f1201a6250772tomee print_prefix(fp, "# ", TRUE, com);
127bbe13a6d36580af6a8ded154f1201a6250772tomee }
127bbe13a6d36580af6a8ded154f1201a6250772tomee
127bbe13a6d36580af6a8ded154f1201a6250772tomee (void) fprintf(fp, "%d\t%d\n", i, msgid_table[i]);
127bbe13a6d36580af6a8ded154f1201a6250772tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (com && IsActiveMode(BackCommentMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee print_prefix(fp, "# ", TRUE, com);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeget_msgid(char *file, int line, int setid, char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SetID si = setid_top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int id = msgid_table[setid];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (si) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (si->id == setid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee MsgID mi = si->top;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (mi) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strcmp(mi->msg, str) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (mi->id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee mi = mi->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee si = si->next;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee id++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (id > NL_MSGMAX) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee src_err(file, line,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee gettext("run out of message number in set number: %d"),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee setid);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NOMSGID);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (msgid_table[setid] = id);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeset_msgid(int setid, int msgid)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msgid_table[setid] < msgid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msgid_table[setid] = msgid;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeadd_comment(Mode mode, char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *tag = (mode == MsgCommentMode) ? mctag : sctag;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **comment = (mode == MsgCommentMode)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ? &msg_comment : &set_comment;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strstr(str, tag) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*comment) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(*comment);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *comment = ustrdup(str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeread_msgfile(char *file)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee FILE *fp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char c = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int line = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int setid = 0, unsetid = -1, msgid = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee struct stat buf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fp = fopen(file, "r")) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("cannot open \"%s\""), file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ResetActiveMode(AppendMode);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (stat(file, &buf) == -1 && buf.st_size == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ResetActiveMode(AppendMode);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee quote = c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*CONSTCOND*/
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char buf[LINE_MAX];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *ptr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char msg[NL_TEXTMAX];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (fgets(buf, sizeof (buf), fp) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee line++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ptr = &buf[0];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SkipSpace(ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*ptr == '$' && (*(ptr+1) == ' ' || *(ptr+1) == '\t')) ||
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ((*ptr == '\n') && inmsg == FALSE)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (strncmp(ptr, SET_TOKEN, sizeof (SET_TOKEN) - 1) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (sscanf(ptr, "%*s %d", &setid) != 1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee setid = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strncmp(ptr, DELSET_TOKEN,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (DELSET_TOKEN) - 1) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (sscanf(ptr, "%*s %d", &unsetid) != 1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee unsetid = -1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (strncmp(ptr, QUOTE_TOKEN,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (QUOTE_TOKEN) - 1) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (sscanf(ptr, "%*s %c", &c) != 1) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee quote = c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (setid == unsetid) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (inmsg) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (is_bs_terminated(ptr)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(msg, ptr, sizeof (msg));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(ptr + len - 1) = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c && (*(ptr + len - 2) == c)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(ptr + len - 2) = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(msg, ptr, sizeof (msg));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee add_msg(setid, msgid, msg, file, line, TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (isdigit((unsigned char)*ptr)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *pptr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SkipSpace(ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msgid = (int)strtol(ptr, &pptr, 10);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ptr = pptr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee SkipSpace(ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (is_bs_terminated(ptr)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) memset(msg, 0, sizeof (msg));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c && (*ptr == c)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ptr++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcpy(msg, ptr, sizeof (msg));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(ptr + len - 1) = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c && ((*ptr == c) &&
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*(ptr + len - 2) == c))) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(ptr + len - 2) = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ptr++;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee add_msg(setid, msgid, ptr, file, line, TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee inmsg = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeis_bs_terminated(char *msg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (--len >= 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msg[len] == ' ' || msg[len] == '\t' || msg[len] == '\n') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee continue;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if (msg[len] == '\\') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len--;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (len >= 0 && msg[len] == '\\')
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeustrdup(char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *tmp = strdup(str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (tmp == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("fatal: out of memory"));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee exit(EXIT_FAILURE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (tmp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeefile_copy(char *in, char *out)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int ret = TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee FILE *fin, *fout;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int c;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sigset_t newmask, oldmask;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigemptyset(&newmask);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigaddset(&newmask, SIGQUIT);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigaddset(&newmask, SIGINT);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigaddset(&newmask, SIGHUP);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigaddset(&newmask, SIGTERM);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigprocmask(SIG_BLOCK, &newmask, &oldmask);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fin = fopen(in, "r")) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("cannot open \"%s\""), in);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ret = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee goto done;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((fout = fopen(out, "w")) == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee prg_err(gettext("cannot create \"%s\""), out);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee ret = FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee goto done;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((c = getc(fin)) != EOF)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) putc(c, fout);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fin);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fclose(fout);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedone:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) sigprocmask(SIG_SETMASK, &oldmask, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (ret);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeemakeup_msg(char **pmsg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char buf[NL_TEXTMAX];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *msg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg = *pmsg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf[0] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (IsActiveMode(TripleMode) && strchr(msg, '%') == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* there is no '%' in message. */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msg[len-2] == '\\' && msg[len-1] == 'n') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg[len-2] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, "\\n", sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *pmsg = ustrdup(buf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg = *pmsg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf[0] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (IsActiveMode(PrefixMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, premsg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *pmsg = ustrdup(buf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg = *pmsg;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee buf[0] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (IsActiveMode(SuffixMode)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len = strlen(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (msg[len-2] == '\\' && msg[len-1] == 'n') {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee msg[len-2] = '\0';
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, sufmsg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, "\\n", sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, msg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strlcat(buf, sufmsg, sizeof (buf));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *pmsg = ustrdup(buf);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeprg_err(char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(stderr, "%s: ", program);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* LINTED: E_SEC_PRINTF_VAR_FMT */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) vfprintf(stderr, fmt, ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(stderr, "\n");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeesrc_err(char *file, int line, char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (suppress_error == TRUE) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(stderr, gettext("\"%s\", line %d: "), file, line);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* LINTED: E_SEC_PRINTF_VAR_FMT */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) vfprintf(stderr, fmt, ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) fprintf(stderr, "\n");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee