diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2013-05-21 19:31:41 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2013-05-21 19:31:41 +0000 |
commit | 3e59977b2736dbe9a3c801882ec4f03a43af07b5 (patch) | |
tree | a03a1bf17406a22bf1ec5f3ba20c3390f280e9e5 | |
parent | 5fd71d61fcdad419f5cd7cb19acd200b4c483b2c (diff) |
DOS 8+3 fixes.
-rw-r--r-- | src/htscharset.c | 6 | ||||
-rw-r--r-- | src/htscharset.h | 8 | ||||
-rw-r--r-- | src/htsname.c | 27 | ||||
-rw-r--r-- | src/htstools.c | 8 |
4 files changed, 33 insertions, 16 deletions
diff --git a/src/htscharset.c b/src/htscharset.c index 1e46562..9f9ee55 100644 --- a/src/htscharset.c +++ b/src/htscharset.c @@ -554,6 +554,7 @@ size_t hts_copyStringUTF8(char *dest, const char *src, size_t size) { for(i = 0, mark = 0; ( i == 0 || bytes[i + 1] != '\0' ) && i <= size; i++) { const unsigned char c = bytes[i]; + dest[i] = c; if (HTS_IS_LEADING_UTF8(c)) { mark = i; } @@ -563,6 +564,11 @@ size_t hts_copyStringUTF8(char *dest, const char *src, size_t size) { return mark; } +size_t hts_appendStringUTF8(char *dest, const char *src, size_t nBytes) { + const size_t size = strlen(dest); + return hts_copyStringUTF8(dest + size, src, nBytes); +} + int hts_isCharsetUTF8(const char *charset) { return charset != NULL && ( strcasecmp(charset, "utf-8") == 0 diff --git a/src/htscharset.h b/src/htscharset.h index 0551e88..f95213c 100644 --- a/src/htscharset.h +++ b/src/htscharset.h @@ -101,6 +101,14 @@ extern size_t hts_stringLengthUTF8(const char *s); extern size_t hts_copyStringUTF8(char *dest, const char *src, size_t nBytes); +/** + * Append at most 'nBytes' bytes from src to dest, not truncating UTF-8 + * sequences. + * Returns the number of bytes appended, not including the terminating \0. + **/ +extern size_t hts_appendStringUTF8(char *dest, const char *src, + size_t nBytes); + /* WIN32 specific. */ #ifdef _WIN32 diff --git a/src/htsname.c b/src/htsname.c index c608de6..3bc8a21 100644 --- a/src/htsname.c +++ b/src/htsname.c @@ -1046,11 +1046,11 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) - strncatbuff(save, final_adr + 4, max_char); + hts_appendStringUTF8(save, final_adr + 4, max_char); else - strncatbuff(save, final_adr, max_char); + hts_appendStringUTF8(save, final_adr, max_char); } else - strncatbuff(save, final_adr, max_char); + hts_appendStringUTF8(save, final_adr, max_char); } /* release */ @@ -1092,12 +1092,12 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) - strncatbuff(save, final_adr + 4, max_char); + hts_appendStringUTF8(save, final_adr + 4, max_char); else - strncatbuff(save, final_adr, max_char); + hts_appendStringUTF8(save, final_adr, max_char); strcatbuff(save, "/"); } else { - strncatbuff(save, final_adr, max_char); + hts_appendStringUTF8(save, final_adr, max_char); strcatbuff(save, "/"); } } @@ -1281,16 +1281,15 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } // { // éliminer les // (comme ftp://) - char *a; + size_t i; - //while( (a=strstr(save,"//")) ) *a='_'; cleanDoubleSlash(save); - // Eliminer chars spéciaux - a = save - 1; - while(*(++a)) - if (((unsigned char) (*a) <= 31) - || ((unsigned char) (*a) == 127)) - *a = '_'; + + for(i = 0 ; save[i] != '\0' ; i++) { + unsigned char c = (unsigned char) save[i]; + if (c < 32 || c == 127) + save[i] = '_'; + } } #if HTS_OVERRIDE_DOS_FOLDERS diff --git a/src/htstools.c b/src/htstools.c index 6f614b7..bb2915d 100644 --- a/src/htstools.c +++ b/src/htstools.c @@ -485,7 +485,7 @@ void longfile_to_83(int mode, char *n83, char *save) { /:;?\#*~ 0x00-0x1f and 0x80-0xff */ - for(i = 0; save[i] != 0; i++) { + for(i = 0, j = 0; save[i] != 0; i++) { char a = save[i]; if (a >= 'a' && a <= 'z') { @@ -494,10 +494,14 @@ void longfile_to_83(int mode, char *n83, char *save) { if (! ((a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9') || a == '_' || a == '.')) { + if (j != 0 && save[j - 1] == '_') { + continue; // avoid __ + } a = '_'; } - save[i] = a; + save[j++] = a; } + save[j] = '\0'; i = j = 0; while((i < max) && (save[j]) && (save[j] != '.')) { |