177 lines
4.6 KiB
Diff
177 lines
4.6 KiB
Diff
Author: Suren A. Chilingaryan <csa@dside.dyndns.org>
|
|
Description: Provides header file
|
|
|
|
Index: dsrecode.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ dsrecode.c 2010-05-21 14:25:19.192590879 +0200
|
|
@@ -0,0 +1,137 @@
|
|
+#include <librcc.h>
|
|
+
|
|
+static rcc_class_default_charset default_oem[] =
|
|
+{
|
|
+ { "ru", "IBM866" },
|
|
+ { NULL, NULL }
|
|
+};
|
|
+
|
|
+static rcc_class_default_charset default_iso[] =
|
|
+{
|
|
+ { "ru", "CP1251" },
|
|
+ { NULL, NULL }
|
|
+};
|
|
+
|
|
+#define OEM_CLASS 0
|
|
+#define ISO_CLASS 1
|
|
+#define OUT_CLASS 2
|
|
+static rcc_class classes[] =
|
|
+{
|
|
+ { "oem", RCC_CLASS_STANDARD, NULL, default_oem, "OEM_INTERN", 0 },
|
|
+ { "iso", RCC_CLASS_STANDARD, NULL, default_iso, "ISO_INTERN", 0 },
|
|
+ { "out", RCC_CLASS_STANDARD, "LC_CTYPE", NULL, "Output", 0 },
|
|
+ { NULL }
|
|
+};
|
|
+
|
|
+int initialized = 0;
|
|
+
|
|
+#ifdef RCC_LAZY
|
|
+#include <dlfcn.h>
|
|
+# define RCC_LIBRARY "librcc.so.0"
|
|
+int (*rccInit2)(void);
|
|
+int (*rccFree2)(void);
|
|
+int (*rccInitDefaultContext2)(const char *locale_variable,
|
|
+ unsigned int max_languages,
|
|
+ unsigned int max_classes,
|
|
+ rcc_class_ptr defclasses,
|
|
+ rcc_init_flags flags);
|
|
+int (*rccInitDb42)(rcc_context ctx, const char *name, rcc_db4_flags flags);
|
|
+char* (*rccSizedRecode2)(rcc_context ctx, rcc_class_id from, rcc_class_id to,
|
|
+ const char *buf, size_t len, size_t *rlen);
|
|
+int (*rccLoad2)(rcc_context ctx, const char *name);
|
|
+
|
|
+
|
|
+static char *rccRecode2(rcc_context ctx, rcc_class_id from,
|
|
+ rcc_class_id to, const char *buf)
|
|
+{
|
|
+ return rccSizedRecode2(ctx, from, to, buf, 0, NULL);
|
|
+}
|
|
+
|
|
+void *rcc_handle;
|
|
+#else /* RCC_LAZY */
|
|
+#define rccInit2 rccInit
|
|
+#define rccFree2 rccFree
|
|
+#define rccInitDefaultContext2 rccInitDefaultContext
|
|
+#define rccInitDb42 rccInitDb4
|
|
+#define rccRecode2 rccRecode
|
|
+#define rccLoad2 rccLoad
|
|
+#endif /* RCC_LAZY */
|
|
+
|
|
+static void rccUnzipFree(void)
|
|
+{
|
|
+ if (initialized > 0) {
|
|
+ rccFree2();
|
|
+#ifdef RCC_LAZY
|
|
+ dlclose(rcc_handle);
|
|
+#endif /* RCC_LAZY */
|
|
+ initialized = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
+static int rccUnzipInit(void)
|
|
+{
|
|
+ if (initialized) return 0;
|
|
+
|
|
+#ifdef RCC_LAZY
|
|
+ rcc_handle = dlopen(RCC_LIBRARY, RTLD_NOW);
|
|
+ if (!rcc_handle) {
|
|
+ initialized = -1;
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ rccInit2 = dlsym(rcc_handle, "rccInit");
|
|
+ rccFree2 = dlsym(rcc_handle, "rccFree");
|
|
+ rccInitDefaultContext2 = dlsym(rcc_handle, "rccInitDefaultContext");
|
|
+ rccInitDb42 = dlsym(rcc_handle, "rccInitDb4");
|
|
+ rccSizedRecode2 = dlsym(rcc_handle, "rccSizedRecode");
|
|
+ rccLoad2 = dlsym(rcc_handle, "rccLoad");
|
|
+
|
|
+ if ((!rccInit2) || (!rccFree2) || (!rccInitDefaultContext2) ||
|
|
+ (!rccInitDb42) || (!rccSizedRecode2) || (!rccLoad2)) {
|
|
+ dlclose(rcc_handle);
|
|
+ initialized = -1;
|
|
+ return 1;
|
|
+ }
|
|
+#endif /* RCC_LAZY */
|
|
+
|
|
+ rccInit2();
|
|
+ rccInitDefaultContext2(NULL, 0, 0, classes, 0);
|
|
+ rccLoad2(NULL, "zip");
|
|
+ rccInitDb42(NULL, NULL, 0);
|
|
+ atexit(rccUnzipFree);
|
|
+ initialized = 1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+void _DS_OEM_INTERN(char *string)
|
|
+{
|
|
+ char *str;
|
|
+ rccUnzipInit();
|
|
+
|
|
+ if (initialized>0) {
|
|
+ str = rccRecode2(NULL, OEM_CLASS, OUT_CLASS, string);
|
|
+
|
|
+ if (str) {
|
|
+ strncpy(string,str,FILNAMSIZ);
|
|
+ free(str);
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void _DS_ISO_INTERN(char *string)
|
|
+{
|
|
+ char *str;
|
|
+ rccUnzipInit();
|
|
+
|
|
+ if (initialized>0) {
|
|
+ str = rccRecode2(NULL, ISO_CLASS, OUT_CLASS, string);
|
|
+
|
|
+ if (str) {
|
|
+ strncpy(string,str,FILNAMSIZ);
|
|
+ free(str);
|
|
+ }
|
|
+ }
|
|
+}
|
|
Index: fileio.c
|
|
===================================================================
|
|
--- fileio.c.orig 2010-05-21 14:25:19.172590765 +0200
|
|
+++ fileio.c 2010-05-21 14:25:19.192590879 +0200
|
|
@@ -82,7 +82,7 @@
|
|
# endif
|
|
#endif
|
|
#include "ebcdic.h" /* definition/initialization of ebcdic[] */
|
|
-
|
|
+#include "dsrecode.c"
|
|
|
|
/*
|
|
Note: Under Windows, the maximum size of the buffer that can be used
|
|
Index: unzpriv.h
|
|
===================================================================
|
|
--- unzpriv.h.orig 2010-05-21 14:24:55.632590821 +0200
|
|
+++ unzpriv.h 2010-05-21 14:25:19.220590722 +0200
|
|
@@ -3025,10 +3025,11 @@ char *GetLoadPath OF((__GPRO));
|
|
!(((islochdr) || (isuxatt)) && \
|
|
((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \
|
|
(hostnum) == FS_HPFS_ || \
|
|
+ (hostnum) == UNIX_ || \
|
|
((hostnum) == FS_NTFS_ && (hostver) == 50)) { \
|
|
- _OEM_INTERN((string)); \
|
|
+ _DS_OEM_INTERN((string)); \
|
|
} else { \
|
|
- _ISO_INTERN((string)); \
|
|
+ _DS_ISO_INTERN((string)); \
|
|
}}
|
|
#endif
|
|
|