summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2013-05-21 19:31:41 +0000
committerXavier Roche <xroche@users.noreply.github.com>2013-05-21 19:31:41 +0000
commit3e59977b2736dbe9a3c801882ec4f03a43af07b5 (patch)
treea03a1bf17406a22bf1ec5f3ba20c3390f280e9e5 /src
parent5fd71d61fcdad419f5cd7cb19acd200b4c483b2c (diff)
DOS 8+3 fixes.
Diffstat (limited to 'src')
-rw-r--r--src/htscharset.c6
-rw-r--r--src/htscharset.h8
-rw-r--r--src/htsname.c27
-rw-r--r--src/htstools.c8
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] != '.')) {