/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk

« back to all changes in this revision

Viewing changes to libssts/utils.c

  • Committer: Gustav Hartvigsson
  • Date: 2016-03-06 21:18:54 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20160306211854-3ja79als141oebhd
* implemented suchar string to cstring converter, needs testing

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
  }
82
82
}
83
83
 
 
84
size_t
 
85
s_ustring_len (const suchar * us) {
 
86
  if (!us) {
 
87
    return 0;
 
88
  }
 
89
  size_t ret_val = 0;
 
90
  suchar * tmp = us;
 
91
  while (*tmp) {
 
92
    ret_val++;
 
93
    us++;
 
94
  }
 
95
  return ret_val;
 
96
}
 
97
 
84
98
schar *
85
99
s_ustring_to_string (const suchar * us) {
86
 
 
 
100
  size_t buflen;
 
101
  schar * buffer;
 
102
  schar * resized;
 
103
  size_t bufpos;
 
104
  mbstate_t mbstate;
 
105
  memset (&mbstate, 0, sizeof (mbstate));
 
106
 
 
107
 
 
108
  /* Save locale */
 
109
  schar * saved_locale;
 
110
  {
 
111
    schar * old_locale;
 
112
    size_t old_locale_len;
 
113
    old_locale = setlocale (LC_ALL, NULL);
 
114
    old_locale_len = strlen (old_locale) + 1;
 
115
    saved_locale = s_malloc (sizeof (char *) * old_locale_len);
 
116
    memcpy (saved_locale, old_locale, old_locale_len);
 
117
    /* set locale */
 
118
    setlocale (LC_ALL, "C.utf8");
 
119
  }
 
120
  
 
121
  
 
122
  schar out[MB_CUR_MAX];
 
123
  for(size_t n = 0, buflen = 4, bufpos = 0;
 
124
        n < s_ustring_len (us);
 
125
        n++, buflen *= 2) {
 
126
    sint rc = c32rtomb(out, us[n], &mbstate);
 
127
    if(! (resized = s_realloc (buffer, buflen)))
 
128
      goto err;
 
129
    for (sint i = 0; i < rc; ++i) {
 
130
      buffer[bufpos];
 
131
      bufpos++;
 
132
    }
 
133
  }
 
134
  
 
135
  /* shrink buffer to actually required size */
 
136
  if (! (resized = s_realloc (buffer, bufpos + 1)))
 
137
    goto err;
 
138
  
 
139
  /* reset locale */
 
140
  setlocale (LC_ALL, saved_locale);
 
141
 
 
142
  return resized;
 
143
err:
 
144
  /* reset locale */
 
145
  setlocale (LC_ALL, saved_locale);
 
146
 
 
147
  s_free(buffer);
87
148
  return NULL;
88
149
}
89
150