[PATCH 2/2] Support UTF8 encoded tags
Thiago Macieira
thiago at macieira.org
Thu Nov 14 13:13:22 UTC 2013
Details below.
I'm not sure this is correct. The changes that are trying to fix the bug
*should* have had no effect.
On quinta-feira, 14 de novembro de 2013 19:47:30, Maximilian Güntner wrote:
> +static void utf8_string(char *buffer, void *_res)
> +{
> + int size;
> + char *res;
> + while (isspace(*buffer))
> + buffer++;
> + size = strlen(buffer);
> + while (size && isspace(buffer[size-1]))
> + size--;
> + if (!size)
> + return;
Note that there's a possible bug here. I know you've just moved the code
around, so this is something for the future.
According to the code above, if utf8_string is called on a string containing
only spaces, the first loop will advance buffer to the end, so strlen(buffer) ==
0. The second loop will never execute because of that, and then we return
without setting _res. That means the caller could see garbage.
> diff --git a/qt-ui/completionmodels.cpp b/qt-ui/completionmodels.cpp
> index 31733ad..965ce87 100644
> --- a/qt-ui/completionmodels.cpp
> +++ b/qt-ui/completionmodels.cpp
> @@ -43,7 +43,7 @@ void TagCompletionModel::updateModel()
> QStringList list;
> struct tag_entry *current_tag_entry = g_tag_list->next;
> while (current_tag_entry != NULL) {
> - list.append(QString(current_tag_entry->tag->name));
> + list.append(QString::fromUtf8(current_tag_entry->tag->name));
This should not be necessary since we set the codec for C strings to UTF-8 in
main(). However, this doesn't hurt.
> diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
> index bd10ed3..7380c72 100644
> --- a/qt-ui/maintab.cpp
> +++ b/qt-ui/maintab.cpp
> @@ -89,6 +89,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
> completers.location = new QCompleter(LocationCompletionModel::instance(),
> ui.location);
> completers.suit = new QCompleter(SuitCompletionModel::instance(),
> ui.suit);
> completers.tags = new QCompleter(TagCompletionModel::instance(),
> ui.tagWidget);
> + completers.tags->setCaseSensitivity(Qt::CaseInsensitive);
Unrelated change? At least, this is not explained.
> ui.buddy->setCompleter(completers.buddy);
> ui.divemaster->setCompleter(completers.divemaster);
> ui.location->setCompleter(completers.location);
> @@ -171,7 +172,7 @@ void MainTab::enableEdition(EditMode newEditMode)
> notesBackup[mydive].datetime = QDateTime::fromTime_t(mydive-
>when -
> gettimezoneoffset()).toString(QString("M/d/yy h:mm")); char buf[1024];
> taglist_get_tagstring(mydive->tag_list, buf, 1024);
> - notesBackup[mydive].tags = QString(buf);
> + notesBackup[mydive].tags = QString::fromUtf8(buf);
Same thing as before: it shouldn't be necessary.
>
> // maybe this is a place for memset?
> for (int i = 0; i < MAX_CYLINDERS; i++) {
> @@ -393,7 +394,7 @@ void MainTab::updateDiveInfo(int dive)
>
> char buf[1024];
> taglist_get_tagstring(d->tag_list, buf, 1024);
> - ui.tagWidget->setText(QString(buf));
> + ui.tagWidget->setText(QString::fromUtf8(buf));
Ditto.
> multiEditEquipmentPlaceholder = *d;
> cylindersModel->setDive(&multiEditEquipmentPlaceholder);
> @@ -695,7 +696,7 @@ void MainTab::saveTags()
> QString tag;
> taglist_clear(mydive->tag_list);
> foreach (tag, ui.tagWidget->getBlockStringList())
> - taglist_add_tag(mydive->tag_list, tag.toAscii().data());
> + taglist_add_tag(mydive->tag_list, tag.toUtf8().data());
Ditto for the reverse: toAscii() is documented to be a misnomer and it
actually encodes using the codec set for the C strings. In this case, it's
UTF-8.
> );
> }
>
> diff --git a/save-xml.c b/save-xml.c
> index 5b0ef42..d16b16d 100644
> --- a/save-xml.c
> +++ b/save-xml.c
> @@ -406,9 +406,9 @@ static void save_tags(FILE *f, struct tag_entry
> *tag_list) fprintf(f, ", ");
> /* If the tag has been translated, write the source to the xml
file */
> if (tmp->tag->source != NULL)
> - fprintf(f, "%s", tmp->tag->source);
> + quote(f, tmp->tag->source, 0);
> else
> - fprintf(f, "%s", tmp->tag->name);
> + quote(f, tmp->tag->name, 0);
Unrelated change?
> tmp = tmp->next;
> more = 1;
> }
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
PGP/GPG: 0x6EF45358; fingerprint:
E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20131114/239fc9c1/attachment.sig>
More information about the subsurface
mailing list