static void read_file (struct buffer *buffer) { int fd; void *map = MAP_FAILED; struct line line_buffer; size_t line_length; const char *line_begin, *line_end, *end; char newline[8]; size_t newline_length = 0; off_t size = 0; uint32_t digest = 0; if (-1 == (fd = open (buffer->path + 7, O_RDONLY))) { if (errno != ENOENT) { set_error (_("Failed to open '%s' for reading: %s"), buffer->path, strerror (errno)); goto failed; } buffer->charset = CHARSET_UTF8; buffer->line_ending = LINE_ENDING_LF; buffer->log = log_open (buffer->undo_path, buffer, 0); if (!buffer->log) goto failed; return; } if (-1 == (size = lseek (fd, 0, SEEK_END))) { static const size_t readbuf_size = 65536; char *readbuf; const char *begin, *end; int ret; struct line encoded_buffer; readbuf = malloc (readbuf_size); ARRAY_INIT (&encoded_buffer); while (0 < (ret = read (fd, readbuf, readbuf_size))) { digest = crc32 (digest, readbuf, ret); if (!buffer->charset) { charset_detect (&buffer->charset, &buffer->line_ending, readbuf, ret); newline_length = charset_encode_line_ending (newline, buffer->charset, buffer->line_ending); } begin = readbuf; end = readbuf + ret; while (begin != end) { line_end = memmem (begin, end - begin, newline, newline_length); if (!line_end) { ARRAY_ADD_SEVERAL (&encoded_buffer, begin, end - begin); break; } ARRAY_ADD_SEVERAL (&encoded_buffer, begin, line_end - begin); begin = line_end + newline_length; line_length = charset_decode (0, buffer->charset, &ARRAY_GET (&encoded_buffer, 0), ARRAY_COUNT (&encoded_buffer)); ARRAY_INIT (&line_buffer); ARRAY_RESERVE (&line_buffer, line_length); charset_decode (&ARRAY_GET (&line_buffer, 0), buffer->charset, &ARRAY_GET (&encoded_buffer, 0), ARRAY_COUNT (&encoded_buffer)); ARRAY_COUNT (&line_buffer) = line_length; pthread_mutex_lock (&buffer->lock); ARRAY_ADD (&buffer->lines, line_buffer); pthread_mutex_unlock (&buffer->lock); ARRAY_RESET (&encoded_buffer); } } } else if (size > 0) { if (MAP_FAILED == (map = mmap (0, size, PROT_READ, MAP_SHARED, fd, 0))) { set_error (_("Failed to mmap '%s': %s"), buffer->path, strerror (errno)); goto failed; } digest = crc32 (0, map, size); charset_detect (&buffer->charset, &buffer->line_ending, map, size); newline_length = charset_encode_line_ending (newline, buffer->charset, buffer->line_ending); end = (char *) map + size; for (line_begin = map; line_begin < end; line_begin = line_end + newline_length) { line_end = memmem (line_begin, end - line_begin, newline, newline_length); if (!line_end) line_end = end; line_length = charset_decode (0, buffer->charset, line_begin, line_end - line_begin); ARRAY_INIT (&line_buffer); ARRAY_RESERVE (&line_buffer, line_length); charset_decode (&ARRAY_GET (&line_buffer, 0), buffer->charset, line_begin, line_end - line_begin); ARRAY_COUNT (&line_buffer) = line_length; pthread_mutex_lock (&buffer->lock); ARRAY_ADD (&buffer->lines, line_buffer); pthread_mutex_unlock (&buffer->lock); /* XXX: Avoid issuing full repaints when nothing really happens onscreen */ gui_repaint (); } } else { buffer->charset = CHARSET_UTF8; buffer->line_ending = LINE_ENDING_LF; } buffer->log = log_open (buffer->undo_path, buffer, digest); failed: if (fd != -1) close (fd); if (map != MAP_FAILED) munmap (map, size); }
int ConvertCDDB2Utf8(PCDDB_INFO pCDDBInfo) { int i, n, len; Z_BUF zBuf; char *ret = NULL; char encoding[MAX_ENCODING_NAME] = {0}; iconv_t conv = (iconv_t)(-1); char tmpArray[BUF_2048_BITS]; /* init */ ZUtilBufInit(&zBuf, 0); if(pCDDBInfo->uCount > 0){ //artist ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->artistname); ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER); //album ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->albumname); ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER); //genre ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[0]->genrename); ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER); } /* package buf for detect charset */ for(i=0;i<pCDDBInfo->uCount;i++){ //track[i] ZUtilAppendStr(&zBuf, pCDDBInfo->trackMeta[i]->trackTitle); ZUtilAppendStr(&zBuf, ZCHAR_DELIMITER); } ZUtilAppendStr(&zBuf, ZCHAR_ENDFLAG); ret = charset_detect(zBuf.buf, zBuf.length); if(ret){ strncpy(encoding, ret, MAX_ENCODING_NAME); ZFREE(ret); } ZUtilBufDestroy(&zBuf); /* Need to convert ??? */ if(strlen(encoding)<=0) return ZAPP_FAILED; if(!strcasecmp("UTF-8", encoding)) return ZAPP_SUCCESS; /* Converting...Now!!! */ conv = iconv_open("UTF-8", encoding); if(conv < 0){ dprintf("Failed to open iconv.\n"); goto errOut; } for(i=0;i<pCDDBInfo->uCount;i++){ //artistname if(pCDDBInfo->trackMeta[i]->artistname){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->artistname, strlen(pCDDBInfo->trackMeta[i]->artistname), tmpArray, &len); if(n < 0){ dprintf("Failed to convert artistname.\n"); } else{ free(pCDDBInfo->trackMeta[i]->artistname); pCDDBInfo->trackMeta[i]->artistname = strdup(tmpArray); } } //albumname if(pCDDBInfo->trackMeta[i]->albumname){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->albumname, strlen(pCDDBInfo->trackMeta[i]->albumname), tmpArray, &len); if(n < 0){ dprintf("Failed to convert albumname.\n"); } else{ free(pCDDBInfo->trackMeta[i]->albumname); pCDDBInfo->trackMeta[i]->albumname = strdup(tmpArray); } } //genrename if(pCDDBInfo->trackMeta[i]->genrename){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->genrename, strlen(pCDDBInfo->trackMeta[i]->genrename), tmpArray, &len); if(n < 0){ dprintf("Failed to convert genrename.\n"); } else{ free(pCDDBInfo->trackMeta[i]->genrename); pCDDBInfo->trackMeta[i]->genrename = strdup(tmpArray); } } //trackTitle if(pCDDBInfo->trackMeta[i]->trackTitle){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->trackTitle, strlen(pCDDBInfo->trackMeta[i]->trackTitle), tmpArray, &len); if(n < 0){ dprintf("Failed to convert trackTitle.\n"); } else{ free(pCDDBInfo->trackMeta[i]->trackTitle); pCDDBInfo->trackMeta[i]->trackTitle = strdup(tmpArray); } } //composername if(pCDDBInfo->trackMeta[i]->composername){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->composername, strlen(pCDDBInfo->trackMeta[i]->composername), tmpArray, &len); if(n < 0){ dprintf("Failed to convert composername.\n"); } else{ free(pCDDBInfo->trackMeta[i]->composername); pCDDBInfo->trackMeta[i]->composername= strdup(tmpArray); } } //workname if(pCDDBInfo->trackMeta[i]->workname){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, pCDDBInfo->trackMeta[i]->workname, strlen(pCDDBInfo->trackMeta[i]->workname), tmpArray, &len); if(n < 0){ dprintf("Failed to convert workname.\n"); } else{ free(pCDDBInfo->trackMeta[i]->workname); pCDDBInfo->trackMeta[i]->workname= strdup(tmpArray); } } METACONVTOUTF(pCDDBInfo->trackMeta[i]->albumattribute1); /*zapp usage totalduration*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->artwork); /*artwork*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->artworkArtist); /*artworkArtist*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->albumDescription); /*albumDescription*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerDescription); /*workComposerDescription*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->storyline); /*storyline*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->workDescription); /*workDescription*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerFirstname); /*workComposerFirstname*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->workComposerLastname); /*workComposerLastname*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->act); /*act*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->arrangedBy); /*arrangedBy*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->artistLink); /*artistLink*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->bpm); /*bpm*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->cadenza); /*cadenza*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->chorus); /*chorus*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->composerFirstname); /*composerFirstname*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->conductorFirstname); /*conductorFirstname*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->conductorLastname); /*conductorLastname*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->instruments); /*instruments*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->ISRC); /*ISRC*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->musicKey); /*musicKey*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->lyricistLibrettist); /*lyricistLibrettist*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->lyricsLibretto); /*lyricsLibretto*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->orchestra); /*orchestra*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->orchestraLink); /*orchestraLink*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->originalArtistSoloist); /*originalArtistSoloist*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->recOriginal); /*recOriginal*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->trackLanguage); /*trackLanguage*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->additionalArtists); /*additionalArtists*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->musicalPeriod); /*musicalPeriod*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->producer); /*producer*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->publisher); /*publisher*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->publisherLink); /*publisherLink*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->recLocation); /*recLocation*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->recMethod); /*recMethod*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->videoLink); /*videoLink*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->whoWouldHaveThought); /*whoWouldHaveThought*/ METACONVTOUTF(pCDDBInfo->trackMeta[i]->scene); /*scene*/ #if 0 int ioffset = 0; int totoffset = sizeof(ZDB_METATRACK)/sizeof(char *); char **pmeta_data = (char **)pCDDBInfo->trackMeta[i]; for(ioffset = 5;ioffset < totoffset;ioffset++){ if(*(pmeta_data + ioffset)){ len = BUF_2048_BITS; memset(tmpArray, 0, BUF_2048_BITS); n = convert(conv, *(pmeta_data + ioffset), strlen(*(pmeta_data + ioffset)), tmpArray, &len); if(n < 0){ dprintf("Failed to convert workname.\n"); } else{ free(*(pmeta_data + ioffset)); *(pmeta_data + ioffset) = strdup(tmpArray); } } } #endif } iconv_close(conv); return ZAPP_SUCCESS; errOut: iconv_close(conv); return ZAPP_FAILED; }