Skip to content

Commit

Permalink
Add mrb_utf8_from_locale, mrb_utf8_free, mrb_locale_from_utf8, mrb_lo…
Browse files Browse the repository at this point in the history
…cale_free. Just works for windows.
  • Loading branch information
mattn committed Mar 7, 2014
1 parent aa4f3c7 commit f3017a9
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 10 deletions.
12 changes: 12 additions & 0 deletions include/mruby.h
Expand Up @@ -259,6 +259,18 @@ mrb_value mrb_str_new_cstr(mrb_state*, const char*);
mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), sizeof(lit) - 1)

#ifdef _WIN32
char* mrb_utf8_from_locale(const char *p, size_t len);
char* mrb_locale_from_utf8(const char *p, size_t len);
#define mrb_locale_free(p) free(p)
#define mrb_utf8_free(p) free(p)
#else
char* mrb_utf8_from_locale(p, l) (p)
char* mrb_locale_from_utf8(p, l) (p)
#define mrb_locale_free(p)
#define mrb_utf8_free(p)
#endif

mrb_state* mrb_open(void);
mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
void mrb_close(mrb_state*);
Expand Down
11 changes: 9 additions & 2 deletions mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
Expand Up @@ -297,6 +297,8 @@ main(int argc, char **argv)


while (TRUE) {
char *utf8;

#ifndef ENABLE_READLINE
print_cmdline(code_block_open);

Expand Down Expand Up @@ -333,14 +335,19 @@ main(int argc, char **argv)
strcpy(ruby_code, last_code_line);
}

utf8 = mrb_utf8_from_locale(ruby_code, -1);
if (!utf8) abort();

/* parse code */
parser = mrb_parser_new(mrb);
parser->s = ruby_code;
parser->send = ruby_code + strlen(ruby_code);
parser->s = utf8;
parser->send = utf8 + strlen(utf8);
parser->lineno = cxt->lineno;
mrb_parser_parse(parser, cxt);
code_block_open = is_code_block_open(parser);

mrb_utf8_free(utf8);

if (code_block_open) {
/* no evaluation of code */
}
Expand Down
11 changes: 9 additions & 2 deletions mrbgems/mruby-bin-mruby/tools/mruby/mruby.c
Expand Up @@ -193,7 +193,11 @@ main(int argc, char **argv)

ARGV = mrb_ary_new_capa(mrb, args.argc);
for (i = 0; i < args.argc; i++) {
mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i])));
char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
if (utf8) {
mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, utf8, strlen(utf8)));
mrb_utf8_free(utf8);
}
}
mrb_define_global_const(mrb, "ARGV", ARGV);

Expand All @@ -216,9 +220,12 @@ main(int argc, char **argv)
v = mrb_load_file_cxt(mrb, args.rfp, c);
}
else {
char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
if (!utf8) abort();
mrbc_filename(mrb, c, "-e");
mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
v = mrb_load_string_cxt(mrb, args.cmdline, c);
v = mrb_load_string_cxt(mrb, utf8, c);
mrb_utf8_free(utf8);
}
}
mrbc_context_free(mrb, c);
Expand Down
16 changes: 10 additions & 6 deletions mrbgems/mruby-print/src/print.c
@@ -1,17 +1,21 @@
#include "mruby.h"
#include "mruby/string.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static void
printstr(mrb_state *mrb, mrb_value obj)
{
char *s;
int len;

if (mrb_string_p(obj)) {
s = RSTRING_PTR(obj);
len = RSTRING_LEN(obj);
fwrite(s, len, 1, stdout);
struct RString *str;
char* ptr;
str = mrb_str_ptr(obj);
ptr = mrb_locale_from_utf8(RSTRING_PTR(obj), RSTRING_LEN(obj));
if (ptr) {
fwrite(ptr, strlen(ptr), 1, stdout);
mrb_locale_free(ptr);
}
}
}

Expand Down
63 changes: 63 additions & 0 deletions src/string.c
Expand Up @@ -54,6 +54,69 @@ typedef struct mrb_shared_string {
static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2);
static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);

#ifdef _WIN32
#include <windows.h>

char*
mrb_utf8_from_locale(const char *str, size_t len)
{
wchar_t* wcsp;
char* mbsp;
size_t mbssize, wcssize;

if (len == 0)
return strdup("");
if (len == -1)
len = strlen(str);
wcssize = MultiByteToWideChar(GetACP(), 0, str, len, NULL, 0);
wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t));
if (!wcsp)
return NULL;
wcssize = MultiByteToWideChar(GetACP(), 0, str, len, wcsp, wcssize + 1);
wcsp[wcssize] = 0;

mbssize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) wcsp, -1, NULL, 0, NULL, NULL);
mbsp = (char*) malloc((mbssize + 1));
if (!mbsp) {
free(wcsp);
return NULL;
}
mbssize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) wcsp, -1, mbsp, mbssize, NULL, NULL);
mbsp[mbssize] = 0;
free(wcsp);
return mbsp;
}

char*
mrb_locale_from_utf8(const char *utf8, size_t len)
{
wchar_t* wcsp;
char* mbsp;
size_t mbssize, wcssize;

if (len == 0)
return strdup("");
if (len == -1)
len = strlen(utf8);
wcssize = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0);
wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t));
if (!wcsp)
return NULL;
wcssize = MultiByteToWideChar(CP_UTF8, 0, utf8, len, wcsp, wcssize + 1);
wcsp[wcssize] = 0;
mbssize = WideCharToMultiByte(GetACP(), 0, (LPCWSTR) wcsp, -1, NULL, 0, NULL, NULL);
mbsp = (char*) malloc((mbssize + 1));
if (!mbsp) {
free(wcsp);
return NULL;
}
mbssize = WideCharToMultiByte(GetACP(), 0, (LPCWSTR) wcsp, -1, mbsp, mbssize, NULL, NULL);
mbsp[mbssize] = 0;
free(wcsp);
return mbsp;
}
#endif

#define RESIZE_CAPA(s,capacity) do {\
if (STR_EMBED_P(s)) {\
if (RSTRING_EMBED_LEN_MAX < (capacity)) {\
Expand Down

0 comments on commit f3017a9

Please sign in to comment.