Author: ek.kato
Date: Thu Apr 17 02:09:18 2008
New Revision: 5423
Modified:
trunk/gtk/compose.c
trunk/qt/immodule-quiminputcontext.h
trunk/qt/immodule-quiminputcontext_compose.cpp
trunk/qt4/immodule/quiminputcontext.h
trunk/qt4/immodule/quiminputcontext_compose.cpp
trunk/xim/compose.cpp
trunk/xim/xim.h
Log:
* gtk/compose.c (im_uim_create_compose_tree)
- Check return value of get_lang_region() properly.
* qt/immodule-quiminputcontext.h
* qt/immodule-quiminputcontext_compose.cpp
* qt4/immodule/quiminputcontext.h
* qt4/immodule/quiminputcontext_compose.cpp
- (get_compose_filename)
- (TransFileName)
- (get_lang_region)
- Sync with gtk/compose.c.
* xim/xim.h
* xim/compose.cpp
- (get_compose_filename)
- (TransFileName)
- Ditto.
Modified: trunk/gtk/compose.c
==============================================================================
--- trunk/gtk/compose.c (original)
+++ trunk/gtk/compose.c Thu Apr 17 02:09:18 2008
@@ -711,6 +711,7 @@
char lang_region[BUFSIZ];
const char *encoding;
char *compose_env;
+ int ret;
name[0] = '\0';
compose_env = getenv("XCOMPOSEFILE");
@@ -733,9 +734,9 @@
if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
return;
- get_lang_region(lang_region, sizeof(lang_region));
+ ret = get_lang_region(lang_region, sizeof(lang_region));
g_get_charset(&encoding);
- if (lang_region == NULL || encoding == NULL) {
+ if (!ret || encoding == NULL) {
fprintf(stderr, "Warning: locale name is NULL\n");
fclose(fp);
return;
Modified: trunk/qt/immodule-quiminputcontext.h
==============================================================================
--- trunk/qt/immodule-quiminputcontext.h (original)
+++ trunk/qt/immodule-quiminputcontext.h Thu Apr 17 02:09:18 2008
@@ -139,14 +139,14 @@
// for X11 Compose
static DefTree *mTreeTop;
static void create_compose_tree( void );
- static char *get_compose_filename( void );
- static char *TransFileName( char *name );
+ static int get_compose_filename( char *filename, size_t len );
+ static int TransFileName( char *transname, const char *name,
size_t len );
static void ParseComposeStringFile( FILE *fp );
static void FreeComposeTree( DefTree *top );
static int parse_compose_line( FILE *fp, char **tokenbuf, size_t
*buflen );
static int get_mb_string( char *buf, unsigned int ks );
static const char *get_encoding( void );
- static char *get_lang_region( void );
+ static int get_lang_region( char *lang_region, size_t len );
Compose *mCompose;
#endif
Modified: trunk/qt/immodule-quiminputcontext_compose.cpp
==============================================================================
--- trunk/qt/immodule-quiminputcontext_compose.cpp (original)
+++ trunk/qt/immodule-quiminputcontext_compose.cpp Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <errno.h>
@@ -362,7 +363,7 @@
switch (c) {
case '\\':
case '"':
- *p++ = c;
+ *p++ = (char)c;
len++;
break;
case 'n':
@@ -426,12 +427,12 @@
token = ERROR;
goto string_error;
default:
- *p++ = c;
+ *p++ = (char)c;
len++;
break;
}
} else {
- *p++ = c;
+ *p++ = (char)c;
len++;
}
}
@@ -454,7 +455,7 @@
*tokenbuf = (char *)realloc(*tokenbuf, *buflen);
}
p = *tokenbuf;
- *p++ = c;
+ *p++ = (char)c;
len++;
c = nextch(fp, lastch);
while (isalnum(c) || c == '_' || c == '-') {
@@ -463,7 +464,7 @@
*tokenbuf = (char *)realloc(*tokenbuf, *buflen);
p = *tokenbuf + len;
}
- *p++ = c;
+ *p++ = (char)c;
len++;
c = nextch(fp, lastch);
}
@@ -510,42 +511,19 @@
return(mask);
}
-char *
-QUimInputContext::TransFileName(char *name)
+int
+QUimInputContext::TransFileName(char *transname, const char *name,
size_t len)
{
- char *home = NULL, *lcCompose = NULL;
- char *i = name, *ret, *j;
- int l = 0;
+ char *home = NULL;
+ char lcCompose[MAXPATHLEN];
+ const char *i = name;
+ char *j;
+ char ret[MAXPATHLEN];
- while (*i) {
- if (*i == '%') {
- i++;
- switch (*i) {
- case '%':
- l++;
- break;
- case 'H':
- home = getenv("HOME");
- if (home)
- l += strlen(home);
- break;
- case 'L':
- lcCompose = get_compose_filename();
- if (lcCompose)
- l += strlen(lcCompose);
- break;
- }
- } else {
- l++;
- }
- i++;
- }
-
- j = ret = (char *)malloc(l + 1);
- if (ret == NULL)
- return ret;
+ j = ret;
i = name;
- while (*i) {
+ lcCompose[0] = ret[0] = '\0';
+ while (*i && j - ret < MAXPATHLEN - 1) {
if (*i == '%') {
i++;
switch (*i) {
@@ -553,16 +531,17 @@
*j++ = '%';
break;
case 'H':
+ home = getenv("HOME");
if (home) {
- strcpy(j, home);
+ strlcat(ret, home, sizeof(ret));
j += strlen(home);
}
break;
case 'L':
- if (lcCompose) {
- strcpy(j, lcCompose);
+ get_compose_filename(lcCompose, sizeof(lcCompose));
+ if (lcCompose[0] != '\0') {
+ strlcat(ret, lcCompose, sizeof(ret));
j += strlen(lcCompose);
- free(lcCompose);
}
break;
}
@@ -570,9 +549,11 @@
} else {
*j++ = *i++;
}
+ *j = '\0';
}
- *j = '\0';
- return ret;
+ strlcpy(transname, ret, len);
+
+ return 1;
}
#ifndef MB_LEN_MAX
@@ -587,23 +568,21 @@
return codec->name();
}
-char *
-QUimInputContext::get_lang_region()
+int
+QUimInputContext::get_lang_region(char *locale, size_t len)
{
- char *locale, *p;
+ char *p;
- locale = setlocale(LC_CTYPE, NULL);
- if (locale) {
- locale = strdup(locale);
- } else {
- return NULL;
+ strlcpy(locale, setlocale(LC_CTYPE, NULL), len);
+ if (locale[0] == '\0') {
+ return 0;
}
p = strrchr(locale, '.');
if (p)
*p = '\0';
- return locale;
+ return 1;
}
int
@@ -668,16 +647,15 @@
n = 0;
do {
if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
- char *filename;
+ char filename[MAXPATHLEN];
FILE *infp;
token = nexttoken(fp, tokenbuf, &lastch, buflen);
if (token != KEY && token != STRING)
goto error;
- if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if ((!TransFileName(filename, *tokenbuf, sizeof(filename))) ||
filename[0] == '\0')
goto error;
infp = fopen(filename, "r");
- free(filename);
if (infp == NULL)
goto error;
ParseComposeStringFile(infp);
@@ -875,119 +853,81 @@
void QUimInputContext::create_compose_tree()
{
FILE *fp = NULL;
- char *name, *tmpname = NULL;
- char *lang_region;
+ char name[MAXPATHLEN];
+ char lang_region[BUFSIZ];
const char *encoding;
+ char *compose_env;
+ int ret;
- name = getenv("XCOMPOSEFILE");
+ name[0] = '\0';
+ compose_env = getenv("XCOMPOSEFILE");
- if (name == NULL) {
+ if (compose_env != NULL) {
+ strlcpy(name, compose_env, sizeof(name));
+ } else {
char *home = getenv("HOME");
if (home != NULL) {
- int hl = strlen(home);
- tmpname = name = (char *)malloc(hl + 10 + 1);
- if (name != NULL) {
- strcpy(name, home);
- strcpy(name + hl, "/.XCompose");
- fp = fopen(name, "r");
- if (fp == NULL) {
- free(name);
- name = tmpname = NULL;
- }
- }
+ snprintf(name, sizeof(name), "%s/.XCompose", home);
+ fp = fopen(name, "r");
+ if (fp == NULL)
+ name[0] = '\0';
}
}
- if (name == NULL) {
- tmpname = name = get_compose_filename();
- }
-
- if (name == NULL)
+ if (name[0] == '\0' && !get_compose_filename(name, sizeof(name)))
return;
- if (fp == NULL) {
- fp = fopen(name, "r");
- }
- if (tmpname != NULL) {
- free(tmpname);
- }
- if (fp == NULL)
+
+ if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
return;
- lang_region = get_lang_region();
+ ret = get_lang_region(lang_region, sizeof(lang_region));
encoding = get_encoding();
- if (lang_region == NULL || encoding == NULL) {
+ if (!ret || encoding == NULL) {
fprintf(stderr, "Warning: locale name is NULL\n");
fclose(fp);
- free(lang_region);
return;
}
ParseComposeStringFile(fp);
fclose(fp);
- free(lang_region);
}
-char *QUimInputContext::get_compose_filename()
+int QUimInputContext::get_compose_filename(char *filename, size_t len)
{
- char *compose_dir_file;
- char *locale;
- char *lang_region;
+ char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+ char locale[BUFSIZ];
const char *encoding;
+ char lang_region[BUFSIZ];
+ int ret;
FILE *fp;
- char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+ char buf[XLC_BUFSIZE];
const char *xlib_dir = XLIB_DIR ;
- lang_region = get_lang_region();
+ ret = get_lang_region(lang_region, sizeof(lang_region));
encoding = get_encoding();
- if (lang_region == NULL || encoding == NULL) {
- free(lang_region);
- return NULL;
- }
-
- locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
- if (locale == NULL) {
- free(lang_region);
- return NULL;
- }
- sprintf(locale, "%s.%s", lang_region, encoding);
- free(lang_region);
+ if (!ret || encoding == NULL)
+ return 0;
- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) +
strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+ snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
if (fp == NULL) {
/* retry with fallback file */
if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
- compose_dir_file = (char *)realloc(compose_dir_file,
- strlen(FALLBACK_XLIB_DIR) +
- strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s",
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
- if (fp == NULL) {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ if (fp == NULL)
+ return 0;
xlib_dir = FALLBACK_XLIB_DIR;
- } else {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ } else
+ return 0;
}
+ name[0] = '\0';
while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
char *p = buf;
int n;
@@ -1004,28 +944,18 @@
}
from = args[1], to = args[0];
if (!strcmp(from, locale)) {
- name = (char *)malloc(strlen(to) + 1);
- if (name != NULL) {
- strcpy(name, to);
- }
+ strlcpy(name, to, sizeof(name));
break;
}
}
fclose(fp);
- free(locale);
- free(compose_dir_file);
- if (name == NULL)
- return NULL;
+ if (name[0] == '\0')
+ return 0;
- filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
- strlen(name) + 3);
- if (filename == NULL)
- return NULL;
- sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- free(name);
+ snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- return filename;
+ return 1;
}
static int
Modified: trunk/qt4/immodule/quiminputcontext.h
==============================================================================
--- trunk/qt4/immodule/quiminputcontext.h (original)
+++ trunk/qt4/immodule/quiminputcontext.h Thu Apr 17 02:09:18 2008
@@ -148,14 +148,14 @@
// for X11 Compose
static DefTree *mTreeTop;
static void create_compose_tree( void );
- static char *get_compose_filename( void );
- static char *TransFileName( char *name );
+ static int get_compose_filename( char *filename, size_t len );
+ static int TransFileName( char *transname, const char *name,
size_t len );
static void ParseComposeStringFile( FILE *fp );
static void FreeComposeTree( DefTree *top );
static int parse_compose_line( FILE *fp, char **tokenbuf, size_t
*buflen );
static int get_mb_string( char *buf, unsigned int ks );
static const char *get_encoding( void );
- static char *get_lang_region( void );
+ static int get_lang_region( char *lang_region, size_t len );
Compose *mCompose;
#endif
Modified: trunk/qt4/immodule/quiminputcontext_compose.cpp
==============================================================================
--- trunk/qt4/immodule/quiminputcontext_compose.cpp (original)
+++ trunk/qt4/immodule/quiminputcontext_compose.cpp Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <errno.h>
#ifdef HAVE_LANGINFO_CODESET
@@ -365,7 +366,7 @@
switch (c) {
case '\\':
case '"':
- *p++ = c;
+ *p++ = (char)c;
len++;
break;
case 'n':
@@ -429,12 +430,12 @@
token = ERROR;
goto string_error;
default:
- *p++ = c;
+ *p++ = (char)c;
len++;
break;
}
} else {
- *p++ = c;
+ *p++ = (char)c;
len++;
}
}
@@ -457,7 +458,7 @@
*tokenbuf = (char *)realloc(*tokenbuf, *buflen);
}
p = *tokenbuf;
- *p++ = c;
+ *p++ = (char)c;
len++;
c = nextch(fp, lastch);
while (isalnum(c) || c == '_' || c == '-') {
@@ -466,7 +467,7 @@
*tokenbuf = (char *)realloc(*tokenbuf, *buflen);
p = *tokenbuf + len;
}
- *p++ = c;
+ *p++ = (char)c;
len++;
c = nextch(fp, lastch);
}
@@ -513,42 +514,19 @@
return(mask);
}
-char *
-QUimInputContext::TransFileName(char *name)
+int
+QUimInputContext::TransFileName(char *transname, const char *name,
size_t len)
{
- char *home = NULL, *lcCompose = NULL;
- char *i = name, *ret, *j;
- int l = 0;
+ char *home = NULL;
+ char lcCompose[MAXPATHLEN];
+ const char *i = name;
+ char *j;
+ char ret[MAXPATHLEN];
- while (*i) {
- if (*i == '%') {
- i++;
- switch (*i) {
- case '%':
- l++;
- break;
- case 'H':
- home = getenv("HOME");
- if (home)
- l += strlen(home);
- break;
- case 'L':
- lcCompose = get_compose_filename();
- if (lcCompose)
- l += strlen(lcCompose);
- break;
- }
- } else {
- l++;
- }
- i++;
- }
-
- j = ret = (char *)malloc(l + 1);
- if (ret == NULL)
- return ret;
+ j = ret;
i = name;
- while (*i) {
+ lcCompose[0] = ret[0] = '\0';
+ while (*i && j - ret < MAXPATHLEN - 1) {
if (*i == '%') {
i++;
switch (*i) {
@@ -556,16 +534,17 @@
*j++ = '%';
break;
case 'H':
+ home = getenv("HOME");
if (home) {
- strcpy(j, home);
+ strlcat(ret, home, sizeof(ret));
j += strlen(home);
}
break;
case 'L':
- if (lcCompose) {
- strcpy(j, lcCompose);
+ get_compose_filename(lcCompose, sizeof(lcCompose));
+ if (lcCompose[0] != '\0') {
+ strlcat(ret, lcCompose, sizeof(ret));
j += strlen(lcCompose);
- free(lcCompose);
}
break;
}
@@ -573,9 +552,11 @@
} else {
*j++ = *i++;
}
+ *j = '\0';
}
- *j = '\0';
- return ret;
+ strlcpy(transname, ret, len);
+
+ return 1;
}
#ifndef MB_LEN_MAX
@@ -608,23 +589,21 @@
#endif
}
-char *
-QUimInputContext::get_lang_region()
+int
+QUimInputContext::get_lang_region(char *locale, size_t len)
{
- char *locale, *p;
+ char *p;
- locale = setlocale(LC_CTYPE, NULL);
- if (locale) {
- locale = strdup(locale);
- } else {
- return NULL;
+ strlcpy(locale, setlocale(LC_CTYPE, NULL), len);
+ if (locale[0] == '\0') {
+ return 0;
}
p = strrchr(locale, '.');
if (p)
*p = '\0';
- return locale;
+ return 1;
}
int
@@ -689,16 +668,15 @@
n = 0;
do {
if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
- char *filename;
+ char filename[MAXPATHLEN];
FILE *infp;
token = nexttoken(fp, tokenbuf, &lastch, buflen);
if (token != KEY && token != STRING)
goto error;
- if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if ((!TransFileName(filename, *tokenbuf, sizeof(filename))) ||
filename[0] == '\0')
goto error;
infp = fopen(filename, "r");
- free(filename);
if (infp == NULL)
goto error;
ParseComposeStringFile(infp);
@@ -896,119 +874,82 @@
void QUimInputContext::create_compose_tree()
{
FILE *fp = NULL;
- char *name, *tmpname = NULL;
- char *lang_region;
+ char name[MAXPATHLEN];
+ char lang_region[BUFSIZ];
const char *encoding;
+ char *compose_env;
+ int ret;
- name = getenv("XCOMPOSEFILE");
+ name[0] = '\0';
+ compose_env = getenv("XCOMPOSEFILE");
- if (name == NULL) {
+ if (compose_env != NULL) {
+ strlcpy(name, compose_env, sizeof(name));
+ } else {
char *home = getenv("HOME");
if (home != NULL) {
- int hl = strlen(home);
- tmpname = name = (char *)malloc(hl + 10 + 1);
- if (name != NULL) {
- strcpy(name, home);
- strcpy(name + hl, "/.XCompose");
- fp = fopen(name, "r");
- if (fp == NULL) {
- free(name);
- name = tmpname = NULL;
- }
- }
+ snprintf(name, sizeof(name), "%s/.XCompose", home);
+ fp = fopen(name, "r");
+ if (fp == NULL)
+ name[0] = '\0';
}
}
- if (name == NULL) {
- tmpname = name = get_compose_filename();
- }
-
- if (name == NULL)
+ if (name[0] == '\0' && !get_compose_filename(name, sizeof(name))) {
return;
- if (fp == NULL) {
- fp = fopen(name, "r");
- }
- if (tmpname != NULL) {
- free(tmpname);
}
- if (fp == NULL)
+
+ if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
return;
- lang_region = get_lang_region();
+ ret = get_lang_region(lang_region, sizeof(lang_region));
encoding = get_encoding();
- if (lang_region == NULL || encoding == NULL) {
+ if (!ret || encoding == NULL) {
fprintf(stderr, "Warning: locale name is NULL\n");
fclose(fp);
- free(lang_region);
return;
}
ParseComposeStringFile(fp);
fclose(fp);
- free(lang_region);
}
-char *QUimInputContext::get_compose_filename()
+int QUimInputContext::get_compose_filename(char *filename, size_t len)
{
- char *compose_dir_file;
- char *locale;
- char *lang_region;
+ char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+ char locale[BUFSIZ];
const char *encoding;
+ char lang_region[BUFSIZ];
+ int ret;
FILE *fp;
- char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+ char buf[XLC_BUFSIZE];
const char *xlib_dir = XLIB_DIR ;
- lang_region = get_lang_region();
+ ret = get_lang_region(lang_region, sizeof(lang_region));
encoding = get_encoding();
- if (lang_region == NULL || encoding == NULL) {
- free(lang_region);
- return NULL;
- }
-
- locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
- if (locale == NULL) {
- free(lang_region);
- return NULL;
- }
- sprintf(locale, "%s.%s", lang_region, encoding);
- free(lang_region);
+ if (!ret || encoding == NULL)
+ return 0;
- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) +
strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+ snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
if (fp == NULL) {
/* retry with fallback file */
if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
- compose_dir_file = (char *)realloc(compose_dir_file,
- strlen(FALLBACK_XLIB_DIR) +
- strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s",
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
- if (fp == NULL) {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ if (fp == NULL)
+ return 0;
xlib_dir = FALLBACK_XLIB_DIR;
- } else {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ } else
+ return 0;
}
+ name[0] = '\0';
while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
char *p = buf;
int n;
@@ -1026,28 +967,18 @@
}
from = args[1], to = args[0];
if (!strcmp(from, locale)) {
- name = (char *)malloc(strlen(to) + 1);
- if (name != NULL) {
- strcpy(name, to);
- }
+ strlcpy(name, to, sizeof(name));
break;
}
}
fclose(fp);
- free(locale);
- free(compose_dir_file);
- if (name == NULL)
- return NULL;
+ if (name[0] == '\0')
+ return 0;
- filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
- strlen(name) + 3);
- if (filename == NULL)
- return NULL;
- sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- free(name);
+ snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- return filename;
+ return 1;
}
static int
Modified: trunk/xim/compose.cpp
==============================================================================
--- trunk/xim/compose.cpp (original)
+++ trunk/xim/compose.cpp Thu Apr 17 02:09:18 2008
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/param.h>
#include <locale.h>
#include <iconv.h>
#include <errno.h>
@@ -363,42 +364,19 @@
return(mask);
}
-char *
-XimIM::TransFileName(char *name)
+int
+XimIM::TransFileName(char *transname, const char *name, size_t len)
{
- char *home = NULL, *lcCompose = NULL;
- char *i = name, *ret, *j;
- int l = 0;
+ char *home = NULL;
+ char lcCompose[MAXPATHLEN];
+ const char *i = name;
+ char *j;
+ char ret[MAXPATHLEN];
- while (*i) {
- if (*i == '%') {
- i++;
- switch (*i) {
- case '%':
- l++;
- break;
- case 'H':
- home = getenv("HOME");
- if (home)
- l += strlen(home);
- break;
- case 'L':
- lcCompose = get_compose_filename();
- if (lcCompose)
- l += strlen(lcCompose);
- break;
- }
- } else {
- l++;
- }
- i++;
- }
-
- j = ret = (char *)malloc(l + 1);
- if (ret == NULL)
- return ret;
+ j = ret;
i = name;
- while (*i) {
+ lcCompose[0] = ret[0] = '\0';
+ while (*i && j - ret < MAXPATHLEN - 1) {
if (*i == '%') {
i++;
switch (*i) {
@@ -406,16 +384,17 @@
*j++ = '%';
break;
case 'H':
+ home = getenv("HOME");
if (home) {
- strcpy(j, home);
+ strlcat(ret, home, sizeof(ret));
j += strlen(home);
}
break;
case 'L':
- if (lcCompose) {
- strcpy(j, lcCompose);
+ get_compose_filename(lcCompose, sizeof(lcCompose));
+ if (lcCompose[0] != '\0') {
+ strlcat(ret, lcCompose, sizeof(ret));
j += strlen(lcCompose);
- free(lcCompose);
}
break;
}
@@ -423,9 +402,11 @@
} else {
*j++ = *i++;
}
+ *j = '\0';
}
- *j = '\0';
- return ret;
+ strlcpy(transname, ret, len);
+
+ return 1;
}
#ifndef MB_LEN_MAX
@@ -496,16 +477,15 @@
n = 0;
do {
if ((token == KEY) && (strcmp("include", *tokenbuf) == 0)) {
- char *filename;
+ char filename[MAXPATHLEN];
FILE *infp;
token = nexttoken(fp, tokenbuf, &lastch, buflen);
if (token != KEY && token != STRING)
goto error;
- if ((filename = TransFileName(*tokenbuf)) == NULL)
+ if (!TransFileName(filename, *tokenbuf, sizeof(filename)) ||
filename[0] == '\0')
goto error;
infp = fopen(filename, "r");
- free(filename);
if (infp == NULL)
goto error;
ParseComposeStringFile(infp);
@@ -695,41 +675,29 @@
void XimIM::create_compose_tree()
{
FILE *fp = NULL;
- char *name, *tmpname = NULL;
+ char name[MAXPATHLEN];
const char *lang_region, *encoding;
+ char *compose_env;
- name = getenv("XCOMPOSEFILE");
+ name[0] = '\0';
+ compose_env = getenv("XCOMPOSEFILE");
- if (name == NULL) {
+ if (compose_env != NULL) {
+ strlcpy(name, compose_env, sizeof(name));
+ } else {
char *home = getenv("HOME");
if (home != NULL) {
- int hl = strlen(home);
- tmpname = name = (char *)malloc(hl + 10 + 1);
- if (name != NULL) {
- strcpy(name, home);
- strcpy(name + hl, "/.XCompose");
- fp = fopen(name, "r");
- if (fp == NULL) {
- free(name);
- name = tmpname = NULL;
- }
- }
+ snprintf(name, sizeof(name), "%s/.XCompose", home);
+ fp = fopen(name, "r");
+ if (fp == NULL)
+ name[0] = '\0';
}
}
- if (name == NULL) {
- tmpname = name = get_compose_filename();
- }
-
- if (name == NULL)
+ if (name[0] == '\0' && !get_compose_filename(name, sizeof(name)))
return;
- if (fp == NULL) {
- fp = fopen(name, "r");
- }
- if (tmpname != NULL) {
- free(tmpname);
- }
- if (fp == NULL)
+
+ if (fp == NULL && ((fp = fopen(name, "r")) == NULL))
return;
lang_region = get_lang_region();
@@ -749,61 +717,40 @@
return mTreeTop;
}
-char *XimIM::get_compose_filename()
+int XimIM::get_compose_filename(char *filename, size_t len)
{
- char *compose_dir_file;
- char *locale;
+ char compose_dir_file[MAXPATHLEN], name[MAXPATHLEN];
+ char locale[BUFSIZ];
const char *lang_region, *encoding;
FILE *fp;
- char buf[XLC_BUFSIZE], *name = NULL, *filename = NULL;
+ char buf[XLC_BUFSIZE];
const char *xlib_dir = XLIB_DIR ;
lang_region = get_lang_region();
encoding = get_encoding();
if (lang_region == NULL || encoding == NULL)
- return NULL;
+ return 0;
- locale = (char *)malloc(strlen(lang_region) + strlen(encoding) + 2);
- if (locale == NULL)
- return NULL;
- sprintf(locale, "%s.%s", lang_region, encoding);
-
- compose_dir_file = (char *)malloc(strlen(XLIB_DIR) +
strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s", XLIB_DIR, COMPOSE_DIR_FILE);
+ snprintf(locale, sizeof(locale), "%s.%s", lang_region, encoding);
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
if (fp == NULL) {
/* retry with fallback file */
if (strcmp(FALLBACK_XLIB_DIR, XLIB_DIR)) {
- compose_dir_file = (char *)realloc(compose_dir_file,
- strlen(FALLBACK_XLIB_DIR) +
- strlen(COMPOSE_DIR_FILE) + 2);
- if (compose_dir_file == NULL) {
- free(locale);
- return NULL;
- }
- sprintf(compose_dir_file, "%s/%s",
+ snprintf(compose_dir_file, sizeof(compose_dir_file), "%s/%s",
FALLBACK_XLIB_DIR, COMPOSE_DIR_FILE);
fp = fopen(compose_dir_file, "r");
- if (fp == NULL) {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ if (fp == NULL)
+ return 0;
xlib_dir = FALLBACK_XLIB_DIR;
- } else {
- free(locale);
- free(compose_dir_file);
- return NULL;
- }
+ } else
+ return 0;
}
+ name[0] = '\0';
while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
char *p = buf;
int n;
@@ -820,28 +767,17 @@
}
from = args[1], to = args[0];
if (!strcmp(from, locale)) {
- name = (char *)malloc(strlen(to) + 1);
- if (name != NULL) {
- strcpy(name, to);
- }
+ strlcpy(name, to, sizeof(name));
break;
}
}
fclose(fp);
- free(locale);
- free(compose_dir_file);
- if (name == NULL)
- return NULL;
-
- filename = (char *)malloc(strlen(xlib_dir) + strlen(XLOCALE_DIR) +
- strlen(name) + 3);
- if (filename == NULL)
- return NULL;
- sprintf(filename, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- free(name);
+ if (name[0] == '\0')
+ return 0;
+ snprintf(filename, len, "%s/%s/%s", xlib_dir, XLOCALE_DIR, name);
- return filename;
+ return 1;
}
static int
Modified: trunk/xim/xim.h
==============================================================================
--- trunk/xim/xim.h (original)
+++ trunk/xim/xim.h Thu Apr 17 02:09:18 2008
@@ -208,8 +208,8 @@
char *mLangRegion;
// for Compose
- char *get_compose_filename();
- char *TransFileName(char *name);
+ int get_compose_filename(char *filename, size_t len);
+ int TransFileName(char *transname, const char *name, size_t len);
void ParseComposeStringFile(FILE *fp);
void FreeComposeTree(DefTree *top);
int parse_compose_line(FILE *fp, char **tokenbuf, size_t *buflen);