2021-10-11 18:37:13 -03:00

111 lines
2.1 KiB
C

/* X/OPEN XPG2 messaging interfaces
* dumb interfaces to real routines
*/
#if !defined(lint) && defined(SCCSIDS)
static char *sccsid = "@(#)catgets.c 1.1 94/10/31 SMI";
#endif
#include <stdio.h>
#include <nl_types.h>
#include <locale.h>
#include <memory.h>
#define MAXCATS 10
extern char *dgettext();
extern char *_current_domain;
static char _cat2domain[MAXCATS][MAXDOMAIN];
char *
catgets(catd, set_num, msg_num, s)
nl_catd catd;
int set_num, msg_num;
char *s;
{
char str[MAXDOMAIN];
register char *res;
if ((catd>=MAXCATS) || (_cat2domain[catd][0] == 0))
return s;
sprintf(str,"%d:%d", set_num, msg_num);
res = dgettext(_cat2domain[catd], str);
if (strcmp(res, str) == 0)
return s;
else
return res;
}
char *catgetmsg(catd,set_id,msg_id,buf,buflen)
nl_catd catd; int set_id; int msg_id; char *buf; int buflen;
{
strncpy (buf, catgets(catd, set_id, msg_id, memset(buf,'\0',buflen)),
buflen-1);
return (buf);
}
/* catopen() fakes up to MAXCATS simultaneous catalogue opens.
* Note that the real stacking of catalogues is done in gettext, where
* the domains are cached. This locale stacking allows
* the (bad style) use of multi catalogues in applications.
*/
nl_catd catopen(name, oflag)
char *name;
int oflag;
{
register int i;
if (name == NULL)
return((nl_catd) -1);
if (_current_domain == NULL) {
if ((_current_domain = (char *)malloc(MAXDOMAIN)) == NULL)
return ((nl_catd) -1);
}
if (*name == '\0')
*name = ' ';
strcpy(_current_domain, name);
/* first look for a re-open of same catalogue. */
for (i=0; i<MAXCATS; i++) {
if (strcmp(_cat2domain[i], name) == 0)
return((nl_catd) i);
}
/* Now assign first free catd */
for (i=0; i<MAXCATS; i++) {
if (_cat2domain[i][0] == 0) {
strcpy(_cat2domain[i], name);
return ((nl_catd) i);
}
}
*_current_domain = 0;
return ((nl_catd) -1);
}
int catclose (catd)
nl_catd catd;
{
if (catd >= MAXCATS)
return -1;
/* Invalidate currently open catalogue */
if (strcmp(_cat2domain[catd],_current_domain) == 0)
*_current_domain = 0;
_cat2domain[catd][0] = 0;
return 0;
}