Fix recovery of UTF8 text file

Fix ask_testdisk_log_creation prototype
This commit is contained in:
Christophe Grenier 2008-02-05 19:37:13 +01:00
parent d8ba9e66a0
commit d8862f988e
2 changed files with 20 additions and 4 deletions

View file

@ -36,6 +36,7 @@
#include "filegen.h" #include "filegen.h"
#include "log.h" #include "log.h"
#include "memmem.h" #include "memmem.h"
#include "log.h"
extern const file_hint_t file_hint_doc; extern const file_hint_t file_hint_doc;
extern const file_hint_t file_hint_jpg; extern const file_hint_t file_hint_jpg;
@ -179,8 +180,11 @@ static int UTF2Lat(unsigned char *buffer_lower, const unsigned char *buffer, con
for (i = buf_len, p = buffer, q = buffer_lower; p-buffer<buf_len && i > 0 && *p!='\0';) for (i = buf_len, p = buffer, q = buffer_lower; p-buffer<buf_len && i > 0 && *p!='\0';)
{ {
const unsigned char *p_org=p; const unsigned char *p_org=p;
if((*p & 0xf0)==0xe0 && (*(p+1) & 0xa0)==0x80 && (*(p+2) & 0xa0)==0x80) if((*p & 0xf0)==0xe0 && (*(p+1) & 0xc0)==0x80 && (*(p+2) & 0xc0)==0x80)
{ /* UTF8 l=3 */ { /* UTF8 l=3 */
#ifdef DEBUG_TXT
log_info("UTF8 l=3 0x%02x 0x%02x 0x02x\n", *p, *(p+1),*(p+2));
#endif
*q = '\0'; *q = '\0';
switch (*p) switch (*p)
{ {
@ -225,7 +229,7 @@ static int UTF2Lat(unsigned char *buffer_lower, const unsigned char *buffer, con
} }
p+=3; p+=3;
} }
else if((*p & 0xe0)==0xc0 && (*(p+1) & 0xa0)==0x80) else if((*p & 0xe0)==0xc0 && (*(p+1) & 0xc0)==0x80)
{ /* UTF8 l=2 */ { /* UTF8 l=2 */
*q = '\0'; *q = '\0';
switch (*p) switch (*p)
@ -236,8 +240,14 @@ static int UTF2Lat(unsigned char *buffer_lower, const unsigned char *buffer, con
(*q)=' '; (*q)=' ';
break; break;
case 0xC3 : case 0xC3 :
switch (*(p+1))
{
case 0xB3 : (*q) = 162; break;
default:
(*q) = (*(p+1)) | 0xC0; /* C0-FF */ (*q) = (*(p+1)) | 0xC0; /* C0-FF */
break; break;
}
break;
case 0xC5 : case 0xC5 :
switch (*(p+1)) { switch (*(p+1)) {
case 0x92 : (*q) = 140; break; case 0x92 : (*q) = 140; break;
@ -265,10 +275,16 @@ static int UTF2Lat(unsigned char *buffer_lower, const unsigned char *buffer, con
} }
else else
{ /* Ascii UCS */ { /* Ascii UCS */
#ifdef DEBUG_TXT
log_info("UTF8 Ascii UCS 0x%02x\n", *p);
#endif
*q = tolower(*p++); *q = tolower(*p++);
} }
if (*q=='\0' || filtre(*q)==0) if (*q=='\0' || filtre(*q)==0)
{ {
#ifdef DEBUG_TXT
log_warning("UTF2Lat reject 0x%x\n",*q);
#endif
*q = '\0'; *q = '\0';
return(p_org-buffer); return(p_org-buffer);
} }

View file

@ -31,4 +31,4 @@ int interface_write(disk_t *disk_car,list_part_t *list_part,const int can_search
list_part_t *ask_structure(disk_t *disk_car,list_part_t *list_part, const int verbose, char **current_cmd); list_part_t *ask_structure(disk_t *disk_car,list_part_t *list_part, const int verbose, char **current_cmd);
void interface_list(disk_t *disk_car, const int verbose, const int saveheader, const int backup, char **current_cmd); void interface_list(disk_t *disk_car, const int verbose, const int saveheader, const int backup, char **current_cmd);
int interface_superblock(disk_t *disk_car,list_part_t *list_part,char**current_cmd); int interface_superblock(disk_t *disk_car,list_part_t *list_part,char**current_cmd);
int ask_testdisklog_creation(void); int ask_testdisk_log_creation(void);