mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 04:46:55 +03:00
Fix show directory and file names in other that system encoding symbolsets (with error of recoding).
Old behaviour: enrties not show, new behaviour: entries show, but marked as broken files if recoding impossible
This commit is contained in:
parent
26f0e58810
commit
df3926d1c4
193
src/strutil.c
193
src/strutil.c
@ -101,109 +101,134 @@ static int
|
|||||||
_str_convert (GIConv coder, char *string, int size, GString * buffer)
|
_str_convert (GIConv coder, char *string, int size, GString * buffer)
|
||||||
{
|
{
|
||||||
int state;
|
int state;
|
||||||
gchar *tmp_buff;
|
gchar *tmp_buff = NULL;
|
||||||
gssize left;
|
gssize left;
|
||||||
gsize bytes_read, bytes_written;
|
gsize bytes_read, bytes_written;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
if (string == NULL || buffer == NULL)
|
||||||
|
return ESTR_FAILURE;
|
||||||
|
|
||||||
if (used_class.is_valid_string (string))
|
if (! used_class.is_valid_string (string))
|
||||||
{
|
{
|
||||||
state = 0;
|
return ESTR_FAILURE;
|
||||||
if (size < 0)
|
}
|
||||||
|
|
||||||
|
state = 0;
|
||||||
|
if (size < 0)
|
||||||
|
{
|
||||||
|
size = strlen (string);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
left = strlen (string);
|
||||||
|
if (left < size)
|
||||||
|
size = left;
|
||||||
|
}
|
||||||
|
|
||||||
|
left = size;
|
||||||
|
|
||||||
|
if (coder == (GIConv) (-1))
|
||||||
|
return ESTR_FAILURE;
|
||||||
|
|
||||||
|
g_iconv (coder, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
while (left)
|
||||||
|
{
|
||||||
|
tmp_buff = g_convert_with_iconv ((const gchar *) string,
|
||||||
|
left,
|
||||||
|
coder,
|
||||||
|
&bytes_read,
|
||||||
|
&bytes_written, &error);
|
||||||
|
if (error)
|
||||||
{
|
{
|
||||||
size = strlen (string);
|
switch (error->code)
|
||||||
|
{
|
||||||
|
case G_CONVERT_ERROR_NO_CONVERSION:
|
||||||
|
/* Conversion between the requested character sets is not supported. */
|
||||||
|
tmp_buff = g_strnfill (strlen (string), '?');
|
||||||
|
g_string_append (buffer, tmp_buff);
|
||||||
|
g_free (tmp_buff);
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
|
return ESTR_FAILURE;
|
||||||
|
break;
|
||||||
|
case G_CONVERT_ERROR_ILLEGAL_SEQUENCE:
|
||||||
|
/* Invalid byte sequence in conversion input. */
|
||||||
|
if (tmp_buff){
|
||||||
|
g_string_append (buffer, tmp_buff);
|
||||||
|
g_free (tmp_buff);
|
||||||
|
}
|
||||||
|
if (bytes_read < left)
|
||||||
|
{
|
||||||
|
string += bytes_read + 1;
|
||||||
|
size -= (bytes_read + 1);
|
||||||
|
left -= (bytes_read + 1);
|
||||||
|
g_string_append_c (buffer, *(string-1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
|
return ESTR_PROBLEM;
|
||||||
|
}
|
||||||
|
state = ESTR_PROBLEM;
|
||||||
|
break;
|
||||||
|
case G_CONVERT_ERROR_PARTIAL_INPUT:
|
||||||
|
/* Partial character sequence at end of input. */
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
|
g_string_append (buffer, tmp_buff);
|
||||||
|
g_free (tmp_buff);
|
||||||
|
if (bytes_read < left)
|
||||||
|
{
|
||||||
|
left = left - bytes_read;
|
||||||
|
tmp_buff = g_strnfill (left, '?');
|
||||||
|
g_string_append (buffer, tmp_buff);
|
||||||
|
g_free (tmp_buff);
|
||||||
|
}
|
||||||
|
return ESTR_PROBLEM;
|
||||||
|
break;
|
||||||
|
case G_CONVERT_ERROR_BAD_URI: /* Don't know how handle this error :( */
|
||||||
|
case G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: /* Don't know how handle this error :( */
|
||||||
|
case G_CONVERT_ERROR_FAILED: /* Conversion failed for some reason. */
|
||||||
|
default:
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
|
if (tmp_buff){
|
||||||
|
g_free (tmp_buff);
|
||||||
|
tmp_buff = NULL;
|
||||||
|
}
|
||||||
|
return ESTR_FAILURE;
|
||||||
|
}
|
||||||
|
g_error_free (error);
|
||||||
|
error = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
left = strlen (string);
|
if (tmp_buff != NULL)
|
||||||
if (left < size)
|
|
||||||
size = left;
|
|
||||||
}
|
|
||||||
left = size;
|
|
||||||
|
|
||||||
if (coder == (GIConv) (-1))
|
|
||||||
return ESTR_FAILURE;
|
|
||||||
|
|
||||||
g_iconv (coder, NULL, NULL, NULL, NULL);
|
|
||||||
|
|
||||||
while (left)
|
|
||||||
{
|
|
||||||
tmp_buff = g_convert_with_iconv ((const gchar *) string,
|
|
||||||
left,
|
|
||||||
coder,
|
|
||||||
&bytes_read,
|
|
||||||
&bytes_written, &error);
|
|
||||||
|
|
||||||
if (error)
|
|
||||||
{
|
{
|
||||||
switch (error->code)
|
if (*tmp_buff){
|
||||||
{
|
|
||||||
case G_CONVERT_ERROR_NO_CONVERSION:
|
|
||||||
/* Conversion between the requested character sets is not supported. */
|
|
||||||
tmp_buff = g_strnfill (strlen (string), '?');
|
|
||||||
g_string_append (buffer, tmp_buff);
|
g_string_append (buffer, tmp_buff);
|
||||||
g_free (tmp_buff);
|
g_free (tmp_buff);
|
||||||
g_error_free (error);
|
string += bytes_read;
|
||||||
return ESTR_PROBLEM;
|
left -= bytes_read;
|
||||||
break;
|
}
|
||||||
case G_CONVERT_ERROR_ILLEGAL_SEQUENCE:
|
else
|
||||||
/* Invalid byte sequence in conversion input. */
|
{
|
||||||
g_string_append (buffer, tmp_buff);
|
g_free (tmp_buff);
|
||||||
g_string_append (buffer, "?");
|
g_string_append (buffer, string);
|
||||||
g_free (tmp_buff);
|
return state;
|
||||||
if (bytes_read < left)
|
|
||||||
{
|
|
||||||
string += bytes_read + 1;
|
|
||||||
size -= (bytes_read + 1);
|
|
||||||
left -= (bytes_read + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_error_free (error);
|
|
||||||
return ESTR_PROBLEM;
|
|
||||||
}
|
|
||||||
state = ESTR_PROBLEM;
|
|
||||||
break;
|
|
||||||
case G_CONVERT_ERROR_PARTIAL_INPUT:
|
|
||||||
/* Partial character sequence at end of input. */
|
|
||||||
g_error_free (error);
|
|
||||||
g_string_append (buffer, tmp_buff);
|
|
||||||
g_free (tmp_buff);
|
|
||||||
if (bytes_read < left)
|
|
||||||
{
|
|
||||||
left = left - bytes_read;
|
|
||||||
tmp_buff = g_strnfill (left, '?');
|
|
||||||
g_string_append (buffer, tmp_buff);
|
|
||||||
g_free (tmp_buff);
|
|
||||||
}
|
|
||||||
return ESTR_PROBLEM;
|
|
||||||
break;
|
|
||||||
case G_CONVERT_ERROR_BAD_URI: /* Don't know how handle this error :( */
|
|
||||||
case G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: /* Don't know how handle this error :( */
|
|
||||||
case G_CONVERT_ERROR_FAILED: /* Conversion failed for some reason. */
|
|
||||||
default:
|
|
||||||
g_error_free (error);
|
|
||||||
if (tmp_buff)
|
|
||||||
g_free (tmp_buff);
|
|
||||||
|
|
||||||
return ESTR_FAILURE;
|
|
||||||
}
|
}
|
||||||
g_error_free (error);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_string_append (buffer, tmp_buff);
|
g_string_append (buffer, string);
|
||||||
g_free (tmp_buff);
|
return ESTR_PROBLEM;
|
||||||
string += bytes_read;
|
|
||||||
left -= bytes_read;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
else
|
return state;
|
||||||
return ESTR_FAILURE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -233,7 +258,7 @@ str_vfs_convert_from (GIConv coder, char *string, GString * buffer)
|
|||||||
|
|
||||||
if (coder == str_cnv_not_convert)
|
if (coder == str_cnv_not_convert)
|
||||||
{
|
{
|
||||||
g_string_append (buffer, string);
|
g_string_append (buffer, (string)?string:"");
|
||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -750,13 +750,13 @@ mc_readdir (DIR *dirp)
|
|||||||
vfs = vfs_op (handle);
|
vfs = vfs_op (handle);
|
||||||
dirinfo = vfs_info (handle);
|
dirinfo = vfs_info (handle);
|
||||||
if (vfs->readdir) {
|
if (vfs->readdir) {
|
||||||
do {
|
// do {
|
||||||
entry = (*vfs->readdir) (dirinfo->info);
|
entry = (*vfs->readdir) (dirinfo->info);
|
||||||
if (entry == NULL) return NULL;
|
if (entry == NULL) return NULL;
|
||||||
g_string_set_size(vfs_str_buffer,0);
|
g_string_set_size(vfs_str_buffer,0);
|
||||||
state = str_vfs_convert_from (dirinfo->converter,
|
state = str_vfs_convert_from (dirinfo->converter,
|
||||||
entry->d_name, vfs_str_buffer);
|
entry->d_name, vfs_str_buffer);
|
||||||
} while (state != 0);
|
// } while (state != 0);
|
||||||
memcpy (&result, entry, sizeof (struct dirent));
|
memcpy (&result, entry, sizeof (struct dirent));
|
||||||
g_strlcpy (result.d_name, vfs_str_buffer->str, NAME_MAX + 1);
|
g_strlcpy (result.d_name, vfs_str_buffer->str, NAME_MAX + 1);
|
||||||
result.d_reclen = strlen (result.d_name);
|
result.d_reclen = strlen (result.d_name);
|
||||||
|
Loading…
Reference in New Issue
Block a user