LINUX.ORG.RU

История изменений

Исправление ttnl, (текущая версия) :

Отлично, у меня все работает. Внешне хорошо получилось.

Давай теперь вид кода приведем в соответствии с тем, как это принято в ядре. Придется немного помучиться, но это обычное дело, с кодом всегда сильно заморачиваются, там не должно быть ничего лишнего.

Удобнее всего работать с патчами. Сделай себе копию линуксового git:

$ git clone --depth=1 http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

После внесения изменений, чтобы их показать другим, выполняют следующие команды:

git diff -M --stat --summary > patch.diff
git diff --summary >> patch.diff

Вот твой патч:

 scripts/kconfig/qconf.cc |   69 +++++++++++++++++++++++++++++++++++++++------
 scripts/kconfig/qconf.h  |    4 ++
 2 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index 1500c38..c12b44d 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -6,7 +6,6 @@
 #include <qglobal.h>
 
 #if QT_VERSION < 0x040000
-#include <stddef.h>
 #include <qmainwindow.h>
 #include <qvbox.h>
 #include <qvaluelist.h>
@@ -996,7 +995,7 @@ void ConfigInfoView::symbolInfo(void)
 {
 	QString str;
 
-	str += "<big>Symbol: <b>";
+    str += "<big>Symbol: <b>";
 	str += print_filter(sym->name);
 	str += "</b></big><br><br>value: ";
 	str += print_filter(sym_get_string_value(sym));
@@ -1197,6 +1196,13 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	layout2->addWidget(searchButton);
 	layout1->addLayout(layout2);
 
+#if QT_VERSION >= 0x040000
+    searchInDescription = new QCheckBox(_("Search in all texts. (each words "
+        "separately by space, show only results containing all the words)"),
+                                        this);
+    layout1->addWidget(searchInDescription);
+#endif
+
 	split = new QSplitter(this);
 	split->setOrientation(Qt::Vertical);
 	list = new ConfigView(split, name);
@@ -1207,6 +1213,7 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
 		parent, SLOT(setMenuLink(struct menu *)));
 
+
 	layout1->addWidget(split);
 
 	if (name) {
@@ -1253,14 +1260,56 @@ void ConfigSearchWindow::search(void)
 	list->list->clear();
 	info->clear();
 
-	result = sym_re_search(editField->text().latin1());
-	if (!result)
-		return;
-	for (p = result; *p; p++) {
-		for_all_prompts((*p), prop)
-			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
-						  menu_is_visible(prop->menu));
-	}
+    symbol_hash;
+#if QT_VERSION >= 0x040000
+    if (searchInDescription->checkState() == Qt::Checked) {
+        QStringList search_list = editField->text().split(" ", QString::SkipEmptyParts);
+        result = sym_re_search(".");
+        if (!result)
+            return;
+        for (p = result; *p; p++) {
+            for_all_prompts((*p), prop) {
+                QString name;
+                QString text;
+                QString help;
+                if (prop->sym->name) {
+                    name = QString::fromUtf8(prop->sym->name);
+                }
+                if (prop->text) {
+                    text = QString::fromUtf8(prop->text);
+                }
+                if (prop->menu) {
+                    struct gstr gstr = str_new();
+                    menu_get_ext_help(prop->menu, &gstr);
+                    help = QString::fromUtf8(str_get(&gstr));
+                    str_free(&gstr);
+                }
+                QString all_text = name + "\n" + text + "\n" + help;
+                bool contain_all = true;
+                for (int i = 0; i < search_list.size(); ++i) {
+                    if (!all_text.contains(search_list.at(i), Qt::CaseInsensitive)) {
+                        contain_all = false;
+                        break;
+                    }
+                }
+                if (contain_all) {
+                    lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                                              menu_is_visible(prop->menu));
+                }
+            }
+        }
+        return;
+    }
+#endif
+    result = sym_re_search(editField->text().latin1());
+    if (!result)
+        return;
+    for (p = result; *p; p++) {
+        for_all_prompts((*p), prop)
+            lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                          menu_is_visible(prop->menu));
+    }
+
 }
 
 /*
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index 3715b3e..e9cddaa 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -7,6 +7,7 @@
 #include <qlistview.h>
 #else
 #include <q3listview.h>
+#include <QCheckBox>
 #endif
 #include <qsettings.h>
 
@@ -294,6 +295,9 @@ protected:
 	QSplitter* split;
 	ConfigView* list;
 	ConfigInfoView* info;
+#if QT_VERSION >= 0x040000
+    QCheckBox* searchInDescription;
+#endif
 
 	struct symbol **result;
 };

1)Удаление #include <stddef.h> из файла qconf.cc, действительно ли оно нужно?

2)Съехал «<big>Symbol: <b>», это однозначно ненужная правка.

3)result = sym_re_search(editField->text().latin1()); — тоже съехала

4)Стиль кодирования в ядре — отступы между блоками с помощью табуляции, а не с помощью 4-х пробелов. Длина строки — не больше 80 символов. Поправь, пожалуйста.

5)symbol_hash; — это наверное описка?

6)QCheckBox* searchInDescription;

Звездочка возле переменной, а не типа

Условие QT_VERSION >= 0x040000 — а для всех версий сразу сделать не получится? Наверное, не получится, если ты так написал.

Исходная версия ttnl, :

Отлично, у меня все работает. Внешне хорошо получилось.

Давай теперь вид кода приведем в соответствии с тем, как это принято в ядре. Придется немного помучиться, но это обычное дело, с кодом всегда сильно заморачиваются, там не должно быть ничего лишнего.

Удобнее всего работать с патчами. Сделай себе копию линуксового git:

$ git clone --depth=1 http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

После внесения изменений, чтобы их показать другим, выполняют следующие команды:

git diff -M --stat --summary > patch.diff git diff --summary >> patch.diff

Вот твой патч:

 scripts/kconfig/qconf.cc |   69 +++++++++++++++++++++++++++++++++++++++------
 scripts/kconfig/qconf.h  |    4 ++
 2 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index 1500c38..c12b44d 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -6,7 +6,6 @@
 #include <qglobal.h>
 
 #if QT_VERSION < 0x040000
-#include <stddef.h>
 #include <qmainwindow.h>
 #include <qvbox.h>
 #include <qvaluelist.h>
@@ -996,7 +995,7 @@ void ConfigInfoView::symbolInfo(void)
 {
 	QString str;
 
-	str += "<big>Symbol: <b>";
+    str += "<big>Symbol: <b>";
 	str += print_filter(sym->name);
 	str += "</b></big><br><br>value: ";
 	str += print_filter(sym_get_string_value(sym));
@@ -1197,6 +1196,13 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	layout2->addWidget(searchButton);
 	layout1->addLayout(layout2);
 
+#if QT_VERSION >= 0x040000
+    searchInDescription = new QCheckBox(_("Search in all texts. (each words "
+        "separately by space, show only results containing all the words)"),
+                                        this);
+    layout1->addWidget(searchInDescription);
+#endif
+
 	split = new QSplitter(this);
 	split->setOrientation(Qt::Vertical);
 	list = new ConfigView(split, name);
@@ -1207,6 +1213,7 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 	connect(list->list, SIGNAL(menuChanged(struct menu *)),
 		parent, SLOT(setMenuLink(struct menu *)));
 
+
 	layout1->addWidget(split);
 
 	if (name) {
@@ -1253,14 +1260,56 @@ void ConfigSearchWindow::search(void)
 	list->list->clear();
 	info->clear();
 
-	result = sym_re_search(editField->text().latin1());
-	if (!result)
-		return;
-	for (p = result; *p; p++) {
-		for_all_prompts((*p), prop)
-			lastItem = new ConfigItem(list->list, lastItem, prop->menu,
-						  menu_is_visible(prop->menu));
-	}
+    symbol_hash;
+#if QT_VERSION >= 0x040000
+    if (searchInDescription->checkState() == Qt::Checked) {
+        QStringList search_list = editField->text().split(" ", QString::SkipEmptyParts);
+        result = sym_re_search(".");
+        if (!result)
+            return;
+        for (p = result; *p; p++) {
+            for_all_prompts((*p), prop) {
+                QString name;
+                QString text;
+                QString help;
+                if (prop->sym->name) {
+                    name = QString::fromUtf8(prop->sym->name);
+                }
+                if (prop->text) {
+                    text = QString::fromUtf8(prop->text);
+                }
+                if (prop->menu) {
+                    struct gstr gstr = str_new();
+                    menu_get_ext_help(prop->menu, &gstr);
+                    help = QString::fromUtf8(str_get(&gstr));
+                    str_free(&gstr);
+                }
+                QString all_text = name + "\n" + text + "\n" + help;
+                bool contain_all = true;
+                for (int i = 0; i < search_list.size(); ++i) {
+                    if (!all_text.contains(search_list.at(i), Qt::CaseInsensitive)) {
+                        contain_all = false;
+                        break;
+                    }
+                }
+                if (contain_all) {
+                    lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                                              menu_is_visible(prop->menu));
+                }
+            }
+        }
+        return;
+    }
+#endif
+    result = sym_re_search(editField->text().latin1());
+    if (!result)
+        return;
+    for (p = result; *p; p++) {
+        for_all_prompts((*p), prop)
+            lastItem = new ConfigItem(list->list, lastItem, prop->menu,
+                          menu_is_visible(prop->menu));
+    }
+
 }
 
 /*
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index 3715b3e..e9cddaa 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -7,6 +7,7 @@
 #include <qlistview.h>
 #else
 #include <q3listview.h>
+#include <QCheckBox>
 #endif
 #include <qsettings.h>
 
@@ -294,6 +295,9 @@ protected:
 	QSplitter* split;
 	ConfigView* list;
 	ConfigInfoView* info;
+#if QT_VERSION >= 0x040000
+    QCheckBox* searchInDescription;
+#endif
 
 	struct symbol **result;
 };

1)Удаление #include <stddef.h> из файла qconf.cc, действительно ли оно нужно?

2)Съехал «<big>Symbol: <b>», это однозначно ненужная правка.

3)result = sym_re_search(editField->text().latin1()); — тоже съехала

4)Стиль кодирования в ядре — отступы между блоками с помощью табуляции, а не с помощью 4-х пробелов. Длина строки — не больше 80 символов. Поправь, пожалуйста.

5)symbol_hash; — это наверное описка?

6)QCheckBox* searchInDescription;

Звездочка возле переменной, а не типа

Условие QT_VERSION >= 0x040000 — а для всех версий сразу сделать не получится? Наверное, не получится, если ты так написал.