diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/kallsyms.c | 94 | ||||
-rw-r--r-- | scripts/kconfig/Makefile | 14 | ||||
-rw-r--r-- | scripts/kconfig/POTFILES.in | 5 | ||||
-rw-r--r-- | scripts/kconfig/conf.c | 20 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 16 | ||||
-rw-r--r-- | scripts/kconfig/gconf.c | 52 | ||||
-rw-r--r-- | scripts/kconfig/kxgettext.c | 221 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 8 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 120 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 4 | ||||
-rw-r--r-- | scripts/kconfig/qconf.cc | 59 | ||||
-rwxr-xr-x | scripts/kernel-doc | 49 | ||||
-rwxr-xr-x | scripts/makeman | 185 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 111 | ||||
-rwxr-xr-x | scripts/patch-kernel | 131 | ||||
-rwxr-xr-x | scripts/split-man | 112 |
16 files changed, 692 insertions, 509 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 090ffda..d3d2e53 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -67,8 +67,9 @@ struct sym_entry { static struct sym_entry *table; static int size, cnt; -static unsigned long long _stext, _etext, _sinittext, _einittext; +static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; static int all_symbols = 0; +static char symbol_prefix_char = '\0'; struct token { unsigned char data[MAX_TOK_SIZE]; @@ -93,7 +94,7 @@ unsigned char best_table_len[256]; static void usage(void) { - fprintf(stderr, "Usage: kallsyms [--all-symbols] < in.map > out.S\n"); + fprintf(stderr, "Usage: kallsyms [--all-symbols] [--symbol-prefix=<prefix char>] < in.map > out.S\n"); exit(1); } @@ -112,6 +113,7 @@ static int read_symbol(FILE *in, struct sym_entry *s) { char str[500]; + char *sym; int rc; rc = fscanf(in, "%llx %c %499s\n", &s->addr, &s->type, str); @@ -123,27 +125,36 @@ read_symbol(FILE *in, struct sym_entry *s) return -1; } + sym = str; + /* skip prefix char */ + if (symbol_prefix_char && str[0] == symbol_prefix_char) + sym++; + /* Ignore most absolute/undefined (?) symbols. */ - if (strcmp(str, "_stext") == 0) + if (strcmp(sym, "_stext") == 0) _stext = s->addr; - else if (strcmp(str, "_etext") == 0) + else if (strcmp(sym, "_etext") == 0) _etext = s->addr; - else if (strcmp(str, "_sinittext") == 0) + else if (strcmp(sym, "_sinittext") == 0) _sinittext = s->addr; - else if (strcmp(str, "_einittext") == 0) + else if (strcmp(sym, "_einittext") == 0) _einittext = s->addr; + else if (strcmp(sym, "_sextratext") == 0) + _sextratext = s->addr; + else if (strcmp(sym, "_eextratext") == 0) + _eextratext = s->addr; else if (toupper(s->type) == 'A') { /* Keep these useful absolute symbols */ - if (strcmp(str, "__kernel_syscall_via_break") && - strcmp(str, "__kernel_syscall_via_epc") && - strcmp(str, "__kernel_sigtramp") && - strcmp(str, "__gp")) + if (strcmp(sym, "__kernel_syscall_via_break") && + strcmp(sym, "__kernel_syscall_via_epc") && + strcmp(sym, "__kernel_sigtramp") && + strcmp(sym, "__gp")) return -1; } else if (toupper(s->type) == 'U' || - is_arm_mapping_symbol(str)) + is_arm_mapping_symbol(sym)) return -1; /* include the type field in the symbol name, so that it gets @@ -177,30 +188,37 @@ symbol_valid(struct sym_entry *s) "_SDA2_BASE_", /* ppc */ NULL }; int i; + int offset = 1; + + /* skip prefix char */ + if (symbol_prefix_char && *(s->sym + 1) == symbol_prefix_char) + offset++; /* if --all-symbols is not specified, then symbols outside the text * and inittext sections are discarded */ if (!all_symbols) { if ((s->addr < _stext || s->addr > _etext) - && (s->addr < _sinittext || s->addr > _einittext)) + && (s->addr < _sinittext || s->addr > _einittext) + && (s->addr < _sextratext || s->addr > _eextratext)) return 0; /* Corner case. Discard any symbols with the same value as - * _etext or _einittext, they can move between pass 1 and 2 - * when the kallsyms data is added. If these symbols move then - * they may get dropped in pass 2, which breaks the kallsyms - * rules. + * _etext _einittext or _eextratext; they can move between pass + * 1 and 2 when the kallsyms data are added. If these symbols + * move then they may get dropped in pass 2, which breaks the + * kallsyms rules. */ - if ((s->addr == _etext && strcmp(s->sym + 1, "_etext")) || - (s->addr == _einittext && strcmp(s->sym + 1, "_einittext"))) + if ((s->addr == _etext && strcmp(s->sym + offset, "_etext")) || + (s->addr == _einittext && strcmp(s->sym + offset, "_einittext")) || + (s->addr == _eextratext && strcmp(s->sym + offset, "_eextratext"))) return 0; } /* Exclude symbols which vary between passes. */ - if (strstr(s->sym + 1, "_compiled.")) + if (strstr(s->sym + offset, "_compiled.")) return 0; for (i = 0; special_symbols[i]; i++) - if( strcmp(s->sym + 1, special_symbols[i]) == 0 ) + if( strcmp(s->sym + offset, special_symbols[i]) == 0 ) return 0; return 1; @@ -225,9 +243,15 @@ read_map(FILE *in) static void output_label(char *label) { - printf(".globl %s\n",label); + if (symbol_prefix_char) + printf(".globl %c%s\n", symbol_prefix_char, label); + else + printf(".globl %s\n", label); printf("\tALGN\n"); - printf("%s:\n",label); + if (symbol_prefix_char) + printf("%c%s:\n", symbol_prefix_char, label); + else + printf("%s:\n", label); } /* uncompress a compressed symbol. When this function is called, the best table @@ -665,6 +689,13 @@ static void optimize_token_table(void) insert_real_symbols_in_table(); + /* When valid symbol is not registered, exit to error */ + if (good_head.left == good_head.right && + bad_head.left == bad_head.right) { + fprintf(stderr, "No valid symbol.\n"); + exit(1); + } + optimize_result(); } @@ -672,9 +703,21 @@ static void optimize_token_table(void) int main(int argc, char **argv) { - if (argc == 2 && strcmp(argv[1], "--all-symbols") == 0) - all_symbols = 1; - else if (argc != 1) + if (argc >= 2) { + int i; + for (i = 1; i < argc; i++) { + if(strcmp(argv[i], "--all-symbols") == 0) + all_symbols = 1; + else if (strncmp(argv[i], "--symbol-prefix=", 16) == 0) { + char *p = &argv[i][16]; + /* skip quote */ + if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\'')) + p++; + symbol_prefix_char = *p; + } else + usage(); + } + } else if (argc != 1) usage(); read_map(stdin); @@ -683,4 +726,3 @@ main(int argc, char **argv) return 0; } - diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 5a5ddc4..09abb89 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -2,7 +2,7 @@ # Kernel configuration targets # These targets are used from top-level makefile -.PHONY: oldconfig xconfig gconfig menuconfig config silentoldconfig +.PHONY: oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config xconfig: $(obj)/qconf $< arch/$(ARCH)/Kconfig @@ -23,6 +23,13 @@ oldconfig: $(obj)/conf silentoldconfig: $(obj)/conf $< -s arch/$(ARCH)/Kconfig +update-po-config: $(obj)/kxgettext + xgettext --default-domain=linux \ + --add-comments --keyword=_ --keyword=N_ \ + --files-from=scripts/kconfig/POTFILES.in \ + -o scripts/kconfig/linux.pot + scripts/kconfig/kxgettext arch/$(ARCH)/Kconfig >> scripts/kconfig/linux.pot + .PHONY: randconfig allyesconfig allnoconfig allmodconfig defconfig randconfig: $(obj)/conf @@ -72,9 +79,10 @@ help: # Based on GTK which needs to be installed to compile it # object files used by all kconfig flavours -hostprogs-y := conf mconf qconf gconf +hostprogs-y := conf mconf qconf gconf kxgettext conf-objs := conf.o zconf.tab.o mconf-objs := mconf.o zconf.tab.o +kxgettext-objs := kxgettext.o zconf.tab.o ifeq ($(MAKECMDGOALS),xconfig) qconf-target := 1 @@ -107,7 +115,7 @@ HOSTLOADLIBES_gconf = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --libs` HOSTCFLAGS_gconf.o = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --cflags` \ -D LKC_DIRECT_LINK -$(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o $(obj)/gconf.o: $(obj)/zconf.tab.h +$(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o $(obj)/gconf.o $(obj)/kxgettext: $(obj)/zconf.tab.h $(obj)/zconf.tab.h: $(src)/zconf.tab.h_shipped $(obj)/zconf.tab.c: $(src)/zconf.tab.c_shipped diff --git a/scripts/kconfig/POTFILES.in b/scripts/kconfig/POTFILES.in new file mode 100644 index 0000000..cc94e46 --- /dev/null +++ b/scripts/kconfig/POTFILES.in @@ -0,0 +1,5 @@ +scripts/kconfig/mconf.c +scripts/kconfig/conf.c +scripts/kconfig/confdata.c +scripts/kconfig/gconf.c +scripts/kconfig/qconf.cc diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index a494d1a..70e7264 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -34,7 +34,7 @@ static int conf_cnt; static signed char line[128]; static struct menu *rootEntry; -static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; +static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); static void strip(signed char *str) { @@ -56,9 +56,9 @@ static void strip(signed char *str) static void check_stdin(void) { if (!valid_stdin && input_mode == ask_silent) { - printf("aborted!\n\n"); - printf("Console input/output is redirected. "); - printf("Run 'make oldconfig' to update configuration.\n\n"); + printf(_("aborted!\n\n")); + printf(_("Console input/output is redirected. ")); + printf(_("Run 'make oldconfig' to update configuration.\n\n")); exit(1); } } @@ -470,7 +470,7 @@ static void check_conf(struct menu *menu) if (sym) { if (sym_is_changable(sym) && !sym_has_value(sym)) { if (!conf_cnt++) - printf("*\n* Restart config...\n*\n"); + printf(_("*\n* Restart config...\n*\n")); rootEntry = menu_get_parent_menu(menu); conf(rootEntry); } @@ -504,7 +504,7 @@ int main(int ac, char **av) input_mode = set_default; defconfig_file = av[i++]; if (!defconfig_file) { - printf("%s: No default config file specified\n", + printf(_("%s: No default config file specified\n"), av[0]); exit(1); } @@ -530,7 +530,7 @@ int main(int ac, char **av) } name = av[i]; if (!name) { - printf("%s: Kconfig file missing\n", av[0]); + printf(_("%s: Kconfig file missing\n"), av[0]); } conf_parse(name); //zconfdump(stdout); @@ -547,12 +547,12 @@ int main(int ac, char **av) break; case ask_silent: if (stat(".config", &tmpstat)) { - printf("***\n" + printf(_("***\n" "*** You have not yet configured your kernel!\n" "***\n" "*** Please run some configurator (e.g. \"make oldconfig\" or\n" "*** \"make menuconfig\" or \"make xconfig\").\n" - "***\n"); + "***\n")); exit(1); } case ask_all: @@ -576,7 +576,7 @@ int main(int ac, char **av) check_conf(&rootmenu); } while (conf_cnt); if (conf_write(NULL)) { - fprintf(stderr, "\n*** Error during writing of the kernel configuration.\n\n"); + fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); return 1; } return 0; diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 1e82ae3..2755c45 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -88,9 +88,9 @@ int conf_read(const char *name) name = conf_expand_value(name); in = zconf_fopen(name); if (in) { - printf("#\n" - "# using defaults found in %s\n" - "#\n", name); + printf(_("#\n" + "# using defaults found in %s\n" + "#\n"), name); break; } } @@ -312,11 +312,11 @@ int conf_write(const char *name) if (env && *env) use_timestamp = 0; - fprintf(out, "#\n" - "# Automatically generated make config: don't edit\n" - "# Linux kernel version: %s\n" - "%s%s" - "#\n", + fprintf(out, _("#\n" + "# Automatically generated make config: don't edit\n" + "# Linux kernel version: %s\n" + "%s%s" + "#\n"), sym_get_string_value(sym), use_timestamp ? "# " : "", use_timestamp ? ctime(&now) : ""); diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index 6fdbe6e..ad6b120 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c @@ -41,7 +41,7 @@ static gboolean resizeable = FALSE; static gboolean config_changed = FALSE; static char nohelp_text[] = - "Sorry, no help available for this option yet.\n"; + N_("Sorry, no help available for this option yet.\n"); GtkWidget *main_wnd = NULL; GtkWidget *tree1_w = NULL; // left frame @@ -193,7 +193,7 @@ void init_main_window(const gchar * glade_file) xml = glade_xml_new(glade_file, "window1", NULL); if (!xml) - g_error("GUI loading failed !\n"); + g_error(_("GUI loading failed !\n")); glade_xml_signal_autoconnect(xml); main_wnd = glade_xml_get_widget(xml, "window1"); @@ -275,7 +275,7 @@ void init_main_window(const gchar * glade_file) /*"style", PANGO_STYLE_OBLIQUE, */ NULL); - sprintf(title, "Linux Kernel v%s Configuration", + sprintf(title, _("Linux Kernel v%s Configuration"), getenv("KERNELRELEASE")); gtk_window_set_title(GTK_WINDOW(main_wnd), title); @@ -325,7 +325,7 @@ void init_left_tree(void) column = gtk_tree_view_column_new(); gtk_tree_view_append_column(view, column); - gtk_tree_view_column_set_title(column, "Options"); + gtk_tree_view_column_set_title(column, _("Options")); renderer = gtk_cell_renderer_toggle_new(); gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), @@ -370,7 +370,7 @@ void init_right_tree(void) column = gtk_tree_view_column_new(); gtk_tree_view_append_column(view, column); - gtk_tree_view_column_set_title(column, "Options"); + gtk_tree_view_column_set_title(column, _("Options")); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), @@ -401,7 +401,7 @@ void init_right_tree(void) renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(view, -1, - "Name", renderer, + _("Name"), renderer, "text", COL_NAME, "foreground-gdk", COL_COLOR, NULL); @@ -425,7 +425,7 @@ void init_right_tree(void) COL_COLOR, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(view, -1, - "Value", renderer, + _("Value"), renderer, "text", COL_VALUE, "editable", COL_EDIT, @@ -466,15 +466,15 @@ static void text_insert_help(struct menu *menu) GtkTextIter start, end; const char *prompt = menu_get_prompt(menu); gchar *name; - const char *help = nohelp_text; + const char *help = _(nohelp_text); if (!menu->sym) help = ""; else if (menu->sym->help) - help = menu->sym->help; + help = _(menu->sym->help); if (menu->sym && menu->sym->name) - name = g_strdup_printf(menu->sym->name); + name = g_strdup_printf(_(menu->sym->name)); else name = g_strdup(""); @@ -530,7 +530,7 @@ gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event, if (config_changed == FALSE) return FALSE; - dialog = gtk_dialog_new_with_buttons("Warning !", + dialog = gtk_dialog_new_with_buttons(_("Warning !"), GTK_WINDOW(main_wnd), (GtkDialogFlags) (GTK_DIALOG_MODAL | @@ -544,7 +544,7 @@ gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event, gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); - label = gtk_label_new("\nSave configuration ?\n"); + label = gtk_label_new(_("\nSave configuration ?\n")); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); gtk_widget_show(label); @@ -604,7 +604,7 @@ load_filename(GtkFileSelection * file_selector, gpointer user_data) (user_data)); if (conf_read(fn)) - text_insert_msg("Error", "Unable to load configuration !"); + text_insert_msg(_("Error"), _("Unable to load configuration !")); else display_tree(&rootmenu); } @@ -613,7 +613,7 @@ void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *fs; - fs = gtk_file_selection_new("Load file..."); + fs = gtk_file_selection_new(_("Load file...")); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(load_filename), (gpointer) fs); @@ -632,7 +632,7 @@ void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data) void on_save1_activate(GtkMenuItem * menuitem, gpointer user_data) { if (conf_write(NULL)) - text_insert_msg("Error", "Unable to save configuration !"); + text_insert_msg(_("Error"), _("Unable to save configuration !")); config_changed = FALSE; } @@ -647,7 +647,7 @@ store_filename(GtkFileSelection * file_selector, gpointer user_data) (user_data)); if (conf_write(fn)) - text_insert_msg("Error", "Unable to save configuration !"); + text_insert_msg(_("Error"), _("Unable to save configuration !")); gtk_widget_destroy(GTK_WIDGET(user_data)); } @@ -656,7 +656,7 @@ void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *fs; - fs = gtk_file_selection_new("Save file as..."); + fs = gtk_file_selection_new(_("Save file as...")); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(store_filename), (gpointer) fs); @@ -740,7 +740,7 @@ on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data) void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *dialog; - const gchar *intro_text = + const gchar *intro_text = _( "Welcome to gkc, the GTK+ graphical kernel configuration tool\n" "for Linux.\n" "For each option, a blank box indicates the feature is disabled, a\n" @@ -756,7 +756,7 @@ void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) "option.\n" "\n" "Toggling Show Debug Info under the Options menu will show \n" - "the dependencies, which you can then match by examining other options."; + "the dependencies, which you can then match by examining other options."); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -773,8 +773,8 @@ void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *dialog; const gchar *about_text = - "gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n" - "Based on the source code from Roman Zippel.\n"; + _("gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n" + "Based on the source code from Roman Zippel.\n"); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -791,9 +791,9 @@ void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *dialog; const gchar *license_text = - "gkc is released under the terms of the GNU GPL v2.\n" - "For more information, please see the source code or\n" - "visit http://www.fsf.org/licenses/licenses.html\n"; + _("gkc is released under the terms of the GNU GPL v2.\n" + "For more information, please see the source code or\n" + "visit http://www.fsf.org/licenses/licenses.html\n"); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -1579,6 +1579,10 @@ int main(int ac, char *av[]) kconfig_load(); #endif + bindtextdomain(PACKAGE, LOCALEDIR); + bind_textdomain_codeset(PACKAGE, "UTF-8"); + textdomain(PACKAGE); + /* GTK stuffs */ gtk_set_locale(); gtk_init(&ac, &av); diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c new file mode 100644 index 0000000..1c88d7c --- /dev/null +++ b/scripts/kconfig/kxgettext.c @@ -0,0 +1,221 @@ +/* + * Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 2005 + * + * Released under the terms of the GNU GPL v2.0 + */ + +#include <stdlib.h> +#include <string.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static char *escape(const char* text, char *bf, int len) +{ + char *bfp = bf; + int multiline = strchr(text, '\n') != NULL; + + *bfp++ = '"'; + --len; + + if (multiline) { + *bfp++ = '"'; + *bfp++ = '\n'; + *bfp++ = '"'; + len -= 3; + } + + while (*text != '\0' && len > 1) { + if (*text == '"') + *bfp++ = '\\'; + else if (*text == '\n') { + *bfp++ = '\\'; + *bfp++ = 'n'; + *bfp++ = '"'; + *bfp++ = '\n'; + *bfp++ = '"'; + len -= 5; + ++text; + goto next; + } + *bfp++ = *text++; +next: + --len; + } + + if (multiline) + bfp -= 3; + + *bfp++ = '"'; + *bfp = '\0'; + + return bf; +} + +struct file_line { + struct file_line *next; + char* file; + int lineno; +}; + +static struct file_line *file_line__new(char *file, int lineno) +{ + struct file_line *self = malloc(sizeof(*self)); + + if (self == NULL) + goto out; + + self->file = file; + self->lineno = lineno; + self->next = NULL; +out: + return self; +} + +struct message { + const char *msg; + const char *option; + struct message *next; + struct file_line *files; +}; + +static struct message *message__list; + +static struct message *message__new(const char *msg, char *option, char *file, int lineno) +{ + struct message *self = malloc(sizeof(*self)); + + if (self == NULL) + goto out; + + self->files = file_line__new(file, lineno); + if (self->files == NULL) + goto out_fail; + + self->msg = strdup(msg); + if (self->msg == NULL) + goto out_fail_msg; + + self->option = option; + self->next = NULL; +out: + return self; +out_fail_msg: + free(self->files); +out_fail: + free(self); + self = NULL; + goto out; +} + +static struct message *mesage__find(const char *msg) +{ + struct message *m = message__list; + + while (m != NULL) { + if (strcmp(m->msg, msg) == 0) + break; + m = m->next; + } + + return m; +} + +static int message__add_file_line(struct message *self, char *file, int lineno) +{ + int rc = -1; + struct file_line *fl = file_line__new(file, lineno); + + if (fl == NULL) + goto out; + + fl->next = self->files; + self->files = fl; + rc = 0; +out: + return rc; +} + +static int message__add(const char *msg, char *option, char *file, int lineno) +{ + int rc = 0; + char bf[16384]; + char *escaped = escape(msg, bf, sizeof(bf)); + struct message *m = mesage__find(escaped); + + if (m != NULL) + rc = message__add_file_line(m, file, lineno); + else { + m = message__new(escaped, option, file, lineno); + + if (m != NULL) { + m->next = message__list; + message__list = m; + } else + rc = -1; + } + return rc; +} + +void menu_build_message_list(struct menu *menu) +{ + struct menu *child; + + message__add(menu_get_prompt(menu), NULL, + menu->file == NULL ? "Root Menu" : menu->file->name, + menu->lineno); + + if (menu->sym != NULL && menu->sym->help != NULL) + message__add(menu->sym->help, menu->sym->name, + menu->file == NULL ? "Root Menu" : menu->file->name, + menu->lineno); + + for (child = menu->list; child != NULL; child = child->next) + if (child->prompt != NULL) + menu_build_message_list(child); +} + +static void message__print_file_lineno(struct message *self) +{ + struct file_line *fl = self->files; + + printf("\n#: %s:%d", fl->file, fl->lineno); + fl = fl->next; + + while (fl != NULL) { + printf(", %s:%d", fl->file, fl->lineno); + fl = fl->next; + } + + if (self->option != NULL) + printf(", %s:00000", self->option); + + putchar('\n'); +} + +static void message__print_gettext_msgid_msgstr(struct message *self) +{ + message__print_file_lineno(self); + + printf("msgid %s\n" + "msgstr \"\"\n", self->msg); +} + +void menu__xgettext(void) +{ + struct message *m = message__list; + + while (m != NULL) { + message__print_gettext_msgid_msgstr(m); + m = m->next; + } +} + +int main(int ac, char **av) +{ + conf_parse(av[1]); + + menu_build_message_list(menu_get_root_menu(NULL)); + menu__xgettext(); + return 0; +} diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index b8a67fc..8b84c42 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -8,6 +8,8 @@ #include "expr.h" +#include <libintl.h> + #ifdef __cplusplus extern "C" { #endif @@ -23,6 +25,12 @@ extern "C" { #define SRCTREE "srctree" +#define PACKAGE "linux" +#define LOCALEDIR "/usr/share/locale" + +#define _(text) gettext(text) +#define N_(text) (text) + int zconfparse(void); void zconfdump(FILE *out); diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 730d316..e5db10c 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -4,6 +4,8 @@ * * Introduced single menu mode (show all sub-menus in one large tree). * 2002-11-06 Petr Baudis <pasky@ucw.cz> + * + * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br> */ #include <sys/ioctl.h> @@ -23,7 +25,7 @@ #include "lkc.h" static char menu_backtitle[128]; -static const char mconf_readme[] = +static const char mconf_readme[] = N_( "Overview\n" "--------\n" "Some kernel features may be built directly into the kernel.\n" @@ -156,39 +158,39 @@ static const char mconf_readme[] = "\n" "Note that this mode can eventually be a little more CPU expensive\n" "(especially with a larger number of unrolled categories) than the\n" -"default mode.\n", -menu_instructions[] = +"default mode.\n"), +menu_instructions[] = N_( "Arrow keys navigate the menu. " "<Enter> selects submenus --->. " "Highlighted letters are hotkeys. " "Pressing <Y> includes, <N> excludes, <M> modularizes features. " "Press <Esc><Esc> to exit, <?> for Help, </> for Search. " - "Legend: [*] built-in [ ] excluded <M> module < > module capable", -radiolist_instructions[] = + "Legend: [*] built-in [ ] excluded <M> module < > module capable"), +radiolist_instructions[] = N_( "Use the arrow keys to navigate this window or " "press the hotkey of the item you wish to select " "followed by the <SPACE BAR>. " - "Press <?> for additional information about this option.", -inputbox_instructions_int[] = + "Press <?> for additional information about this option."), +inputbox_instructions_int[] = N_( "Please enter a decimal value. " "Fractions will not be accepted. " - "Use the <TAB> key to move from the input field to the buttons below it.", -inputbox_instructions_hex[] = + "Use the <TAB> key to move from the input field to the buttons below it."), +inputbox_instructions_hex[] = N_( "Please enter a hexadecimal value. " - "Use the <TAB> key to move from the input field to the buttons below it.", -inputbox_instructions_string[] = + "Use the <TAB> key to move from the input field to the buttons below it."), +inputbox_instructions_string[] = N_( "Please enter a string value. " - "Use the <TAB> key to move from the input field to the buttons below it.", -setmod_text[] = + "Use the <TAB> key to move from the input field to the buttons below it."), +setmod_text[] = N_( "This feature depends on another which has been configured as a module.\n" - "As a result, this feature will be built as a module.", -nohelp_text[] = - "There is no help available for this kernel option.\n", -load_config_text[] = + "As a result, this feature will be built as a module."), +nohelp_text[] = N_( + "There is no help available for this kernel option.\n"), +load_config_text[] = N_( "Enter the name of the configuration file you wish to load. " "Accept the name shown to restore the configuration you " - "last retrieved. Leave blank to abort.", -load_config_help[] = + "last retrieved. Leave blank to abort."), +load_config_help[] = N_( "\n" "For various reasons, one may wish to keep several different kernel\n" "configurations available on a single machine.\n" @@ -198,11 +200,11 @@ load_config_help[] = "to modify that configuration.\n" "\n" "If you are uncertain, then you have probably never used alternate\n" - "configuration files. You should therefor leave this blank to abort.\n", -save_config_text[] = + "configuration files. You should therefor leave this blank to abort.\n"), +save_config_text[] = N_( "Enter a filename to which this configuration should be saved " - "as an alternate. Leave blank to abort.", -save_config_help[] = + "as an alternate. Leave blank to abort."), +save_config_help[] = N_( "\n" "For various reasons, one may wish to keep different kernel\n" "configurations available on a single machine.\n" @@ -212,8 +214,8 @@ save_config_help[] = "configuration options you have selected at that time.\n" "\n" "If you are uncertain what all this means then you should probably\n" - "leave this blank.\n", -search_help[] = + "leave this blank.\n"), +search_help[] = N_( "\n" "Search for CONFIG_ symbols and display their relations.\n" "Example: search for \"^FOO\"\n" @@ -250,7 +252,7 @@ search_help[] = "Examples: USB => find all CONFIG_ symbols containing USB\n" " ^USB => find all CONFIG_ symbols starting with USB\n" " USB$ => find all CONFIG_ symbols ending with USB\n" - "\n"; + "\n"); static signed char buf[4096], *bufptr = buf; static signed char input_buf[4096]; @@ -305,8 +307,8 @@ static void init_wsize(void) } if (rows < 19 || cols < 80) { - fprintf(stderr, "Your display is too small to run Menuconfig!\n"); - fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + fprintf(stderr, N_("Your display is too small to run Menuconfig!\n")); + fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n")); exit(1); } @@ -526,9 +528,9 @@ static void search_conf(void) again: cprint_init(); cprint("--title"); - cprint("Search Configuration Parameter"); + cprint(_("Search Configuration Parameter")); cprint("--inputbox"); - cprint("Enter Keyword"); + cprint(_("Enter Keyword")); cprint("10"); cprint("75"); cprint(""); @@ -539,7 +541,7 @@ again: case 0: break; case 1: - show_helptext("Search Configuration", search_help); + show_helptext(_("Search Configuration"), search_help); goto again; default: return; @@ -548,7 +550,7 @@ again: sym_arr = sym_re_search(input_buf); res = get_relations_str(sym_arr); free(sym_arr); - show_textbox("Search Results", str_get(&res), 0, 0); + show_textbox(_("Search Results"), str_get(&res), 0, 0); str_free(&res); } @@ -721,9 +723,9 @@ static void conf(struct menu *menu) while (1) { cprint_init(); cprint("--title"); - cprint("%s", prompt ? prompt : "Main Menu"); + cprint("%s", prompt ? prompt : _("Main Menu")); cprint("--menu"); - cprint(menu_instructions); + cprint(_(menu_instructions)); cprint("%d", rows); cprint("%d", cols); cprint("%d", rows - 10); @@ -736,9 +738,9 @@ static void conf(struct menu *menu) cprint(":"); cprint("--- "); cprint("L"); - cprint(" Load an Alternate Configuration File"); + cprint(_(" Load an Alternate Configuration File")); cprint("S"); - cprint(" Save Configuration to an Alternate File"); + cprint(_(" Save Configuration to an Alternate File")); } stat = exec_conf(); if (stat < 0) @@ -793,7 +795,7 @@ static void conf(struct menu *menu) if (sym) show_help(submenu); else - show_helptext("README", mconf_readme); + show_helptext("README", _(mconf_readme)); break; case 3: if (type == 't') { @@ -849,7 +851,7 @@ static void show_help(struct menu *menu) { if (sym->name) { str_printf(&help, "CONFIG_%s:\n\n", sym->name); - str_append(&help, sym->help); + str_append(&help, _(sym->help)); str_append(&help, "\n"); } } else { @@ -886,9 +888,9 @@ static void conf_choice(struct menu *menu) while (1) { cprint_init(); cprint("--title"); - cprint("%s", prompt ? prompt : "Main Menu"); + cprint("%s", prompt ? prompt : _("Main Menu")); cprint("--radiolist"); - cprint(radiolist_instructions); + cprint(_(radiolist_instructions)); cprint("15"); cprint("70"); cprint("6"); @@ -935,17 +937,17 @@ static void conf_string(struct menu *menu) while (1) { cprint_init(); cprint("--title"); - cprint("%s", prompt ? prompt : "Main Menu"); + cprint("%s", prompt ? prompt : _("Main Menu")); cprint("--inputbox"); switch (sym_get_type(menu->sym)) { case S_INT: - cprint(inputbox_instructions_int); + cprint(_(inputbox_instructions_int)); break; case S_HEX: - cprint(inputbox_instructions_hex); + cprint(_(inputbox_instructions_hex)); break; case S_STRING: - cprint(inputbox_instructions_string); + cprint(_(inputbox_instructions_string)); break; default: /* panic? */; @@ -958,7 +960,7 @@ static void conf_string(struct menu *menu) case 0: if (sym_set_string_value(menu->sym, input_buf)) return; - show_textbox(NULL, "You have made an invalid entry.", 5, 43); + show_textbox(NULL, _("You have made an invalid entry."), 5, 43); break; case 1: show_help(menu); @@ -987,10 +989,10 @@ static void conf_load(void) return; if (!conf_read(input_buf)) return; - show_textbox(NULL, "File does not exist!", 5, 38); + show_textbox(NULL, _("File does not exist!"), 5, 38); break; case 1: - show_helptext("Load Alternate Configuration", load_config_help); + show_helptext(_("Load Alternate Configuration"), load_config_help); break; case 255: return; @@ -1016,10 +1018,10 @@ static void conf_save(void) return; if (!conf_write(input_buf)) return; - show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); + show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60); break; case 1: - show_helptext("Save Alternate Configuration", save_config_help); + show_helptext(_("Save Alternate Configuration"), save_config_help); break; case 255: return; @@ -1040,12 +1042,16 @@ int main(int ac, char **av) char *mode; int stat; + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + conf_parse(av[1]); conf_read(NULL); sym = sym_lookup("KERNELRELEASE", 0); sym_calc_value(sym); - sprintf(menu_backtitle, "Linux Kernel v%s Configuration", + sprintf(menu_backtitle, _("Linux Kernel v%s Configuration"), sym_get_string_value(sym)); mode = getenv("MENUCONFIG_MODE"); @@ -1062,7 +1068,7 @@ int main(int ac, char **av) do { cprint_init(); cprint("--yesno"); - cprint("Do you wish to save your new kernel configuration?"); + cprint(_("Do you wish to save your new kernel configuration?")); cprint("5"); cprint("60"); stat = exec_conf(); @@ -1070,20 +1076,20 @@ int main(int ac, char **av) if (stat == 0) { if (conf_write(NULL)) { - fprintf(stderr, "\n\n" + fprintf(stderr, _("\n\n" "Error during writing of the kernel configuration.\n" "Your kernel configuration changes were NOT saved." - "\n\n"); + "\n\n")); return 1; } - printf("\n\n" + printf(_("\n\n" "*** End of Linux kernel configuration.\n" "*** Execute 'make' to build the kernel or try 'make help'." - "\n\n"); + "\n\n")); } else { - fprintf(stderr, "\n\n" + fprintf(stderr, _("\n\n" "Your kernel configuration changes were NOT saved." - "\n\n"); + "\n\n")); } return 0; diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 0c13156..8c59b21 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -365,9 +365,9 @@ bool menu_is_visible(struct menu *menu) const char *menu_get_prompt(struct menu *menu) { if (menu->prompt) - return menu->prompt->text; + return _(menu->prompt->text); else if (menu->sym) - return menu->sym->name; + return _(menu->sym->name); return NULL; } diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index 0cdbf9d..4590cd3 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -26,8 +26,23 @@ #include "qconf.moc" #include "images.c" +#ifdef _ +# undef _ +# define _ qgettext +#endif + static QApplication *configApp; +static inline QString qgettext(const char* str) +{ + return QString::fromLocal8Bit(gettext(str)); +} + +static inline QString qgettext(const QString& str) +{ + return QString::fromLocal8Bit(gettext(str.latin1())); +} + ConfigSettings::ConfigSettings() : showAll(false), showName(false), showRange(false), showData(false) { @@ -177,7 +192,7 @@ void ConfigItem::updateMenu(void) sym = menu->sym; prop = menu->prompt; - prompt = menu_get_prompt(menu); + prompt = QString::fromLocal8Bit(menu_get_prompt(menu)); if (prop) switch (prop->type) { case P_MENU: @@ -203,7 +218,7 @@ void ConfigItem::updateMenu(void) if (!sym) goto set_prompt; - setText(nameColIdx, sym->name); + setText(nameColIdx, QString::fromLocal8Bit(sym->name)); type = sym_get_type(sym); switch (type) { @@ -213,9 +228,9 @@ void ConfigItem::updateMenu(void) if (!sym_is_changable(sym) && !list->showAll) { setPixmap(promptColIdx, 0); - setText(noColIdx, 0); - setText(modColIdx, 0); - setText(yesColIdx, 0); + setText(noColIdx, QString::null); + setText(modColIdx, QString::null); + setText(yesColIdx, QString::null); break; } expr = sym_get_tristate_value(sym); @@ -257,6 +272,7 @@ void ConfigItem::updateMenu(void) const char* data; data = sym_get_string_value(sym); + #if QT_VERSION >= 300 int i = list->mapIdx(dataColIdx); if (i >= 0) @@ -264,9 +280,9 @@ void ConfigItem::updateMenu(void) #endif setText(dataColIdx, data); if (type == S_STRING) - prompt.sprintf("%s: %s", prompt.latin1(), data); + prompt = QString("%1: %2").arg(prompt).arg(data); else - prompt.sprintf("(%s) %s", data, prompt.latin1()); + prompt = QString("(%2) %1").arg(prompt).arg(data); break; } if (!sym_has_value(sym) && visible) @@ -343,9 +359,9 @@ void ConfigLineEdit::show(ConfigItem* i) { item = i; if (sym_get_string_value(item->menu->sym)) - setText(sym_get_string_value(item->menu->sym)); + setText(QString::fromLocal8Bit(sym_get_string_value(item->menu->sym))); else - setText(0); + setText(QString::null); Parent::show(); setFocus(); } @@ -961,7 +977,7 @@ ConfigMainWindow::ConfigMainWindow(void) delete configSettings; } -static QString print_filter(const char *str) +static QString print_filter(const QString &str) { QRegExp re("[<>&\"\\n]"); QString res = str; @@ -994,7 +1010,7 @@ static QString print_filter(const char *str) static void expr_print_help(void *data, const char *str) { - ((QString*)data)->append(print_filter(str)); + reinterpret_cast<QString*>(data)->append(print_filter(str)); } /* @@ -1009,7 +1025,7 @@ void ConfigMainWindow::setHelp(QListViewItem* item) if (item) menu = ((ConfigItem*)item)->menu; if (!menu) { - helpText->setText(NULL); + helpText->setText(QString::null); return; } @@ -1019,16 +1035,16 @@ void ConfigMainWindow::setHelp(QListViewItem* item) if (sym) { if (menu->prompt) { head += "<big><b>"; - head += print_filter(menu->prompt->text); + head += print_filter(_(menu->prompt->text)); head += "</b></big>"; if (sym->name) { head += " ("; - head += print_filter(sym->name); + head += print_filter(_(sym->name)); head += ")"; } } else if (sym->name) { head += "<big><b>"; - head += print_filter(sym->name); + head += print_filter(_(sym->name)); head += "</b></big>"; } head += "<br><br>"; @@ -1049,7 +1065,7 @@ void ConfigMainWindow::setHelp(QListViewItem* item) case P_PROMPT: case P_MENU: debug += "prompt: "; - debug += print_filter(prop->text); + debug += print_filter(_(prop->text)); debug += "<br>"; break; case P_DEFAULT: @@ -1088,10 +1104,10 @@ void ConfigMainWindow::setHelp(QListViewItem* item) debug += "<br>"; } - help = print_filter(sym->help); + help = print_filter(_(sym->help)); } else if (menu->prompt) { head += "<big><b>"; - head += print_filter(menu->prompt->text); + head += print_filter(_(menu->prompt->text)); head += "</b></big><br><br>"; if (showDebug) { if (menu->prompt->visible.expr) { @@ -1111,7 +1127,7 @@ void ConfigMainWindow::loadConfig(void) QString s = QFileDialog::getOpenFileName(".config", NULL, this); if (s.isNull()) return; - if (conf_read(s.latin1())) + if (conf_read(QFile::encodeName(s))) QMessageBox::information(this, "qconf", "Unable to load configuration!"); ConfigView::updateListAll(); } @@ -1127,7 +1143,7 @@ void ConfigMainWindow::saveConfigAs(void) QString s = QFileDialog::getSaveFileName(".config", NULL, this); if (s.isNull()) return; - if (conf_write(s.latin1())) + if (conf_write(QFile::encodeName(s))) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } @@ -1372,6 +1388,9 @@ int main(int ac, char** av) ConfigMainWindow* v; const char *name; + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + #ifndef LKC_DIRECT_LINK kconfig_load(); #endif diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 8b1dab6..0835dc2 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc @@ -553,15 +553,20 @@ sub output_section_xml(%) { # print out each section $lineprefix=" "; foreach $section (@{$args{'sectionlist'}}) { - print "<refsect1>\n <title>$section</title>\n <para>\n"; + print "<refsect1>\n"; + print "<title>$section</title>\n"; if ($section =~ m/EXAMPLE/i) { - print "<example><para>\n"; + print "<informalexample><programlisting>\n"; + } else { + print "<para>\n"; } output_highlight($args{'sections'}{$section}); if ($section =~ m/EXAMPLE/i) { - print "</para></example>\n"; + print "</programlisting></informalexample>\n"; + } else { + print "</para>\n"; } - print " </para>\n</refsect1>\n"; + print "</refsect1>\n"; } } @@ -576,8 +581,14 @@ sub output_function_xml(%) { $id =~ s/[^A-Za-z0-9]/-/g; print "<refentry>\n"; + print "<refentryinfo>\n"; + print " <title>LINUX</title>\n"; + print " <productname>Kernel Hackers Manual</productname>\n"; + print " <date>$man_date</date>\n"; + print "</refentryinfo>\n"; print "<refmeta>\n"; - print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n"; + print " <refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n"; + print " <manvolnum>9</manvolnum>\n"; print "</refmeta>\n"; print "<refnamediv>\n"; print " <refname>".$args{'function'}."</refname>\n"; @@ -607,7 +618,7 @@ sub output_function_xml(%) { } } } else { - print " <void>\n"; + print " <void/>\n"; } print " </funcprototype></funcsynopsis>\n"; print "</refsynopsisdiv>\n"; @@ -646,8 +657,14 @@ sub output_struct_xml(%) { $id =~ s/[^A-Za-z0-9]/-/g; print "<refentry>\n"; + print "<refentryinfo>\n"; + print " <title>LINUX</title>\n"; + print " <productname>Kernel Hackers Manual</productname>\n"; + print " <date>$man_date</date>\n"; + print "</refentryinfo>\n"; print "<refmeta>\n"; - print "<refentrytitle><phrase id=\"$id\">".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n"; + print " <refentrytitle><phrase id=\"$id\">".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n"; + print " <manvolnum>9</manvolnum>\n"; print "</refmeta>\n"; print "<refnamediv>\n"; print " <refname>".$args{'type'}." ".$args{'struct'}."</refname>\n"; @@ -724,8 +741,14 @@ sub output_enum_xml(%) { $id =~ s/[^A-Za-z0-9]/-/g; print "<refentry>\n"; + print "<refentryinfo>\n"; + print " <title>LINUX</title>\n"; + print " <productname>Kernel Hackers Manual</productname>\n"; + print " <date>$man_date</date>\n"; + print "</refentryinfo>\n"; print "<refmeta>\n"; - print "<refentrytitle><phrase id=\"$id\">enum ".$args{'enum'}."</phrase></refentrytitle>\n"; + print " <refentrytitle><phrase id=\"$id\">enum ".$args{'enum'}."</phrase></refentrytitle>\n"; + print " <manvolnum>9</manvolnum>\n"; print "</refmeta>\n"; print "<refnamediv>\n"; print " <refname>enum ".$args{'enum'}."</refname>\n"; @@ -784,8 +807,14 @@ sub output_typedef_xml(%) { $id =~ s/[^A-Za-z0-9]/-/g; print "<refentry>\n"; + print "<refentryinfo>\n"; + print " <title>LINUX</title>\n"; + print " <productname>Kernel Hackers Manual</productname>\n"; + print " <date>$man_date</date>\n"; + print "</refentryinfo>\n"; print "<refmeta>\n"; - print "<refentrytitle><phrase id=\"$id\">typedef ".$args{'typedef'}."</phrase></refentrytitle>\n"; + print " <refentrytitle><phrase id=\"$id\">typedef ".$args{'typedef'}."</phrase></refentrytitle>\n"; + print " <manvolnum>9</manvolnum>\n"; print "</refmeta>\n"; print "<refnamediv>\n"; print " <refname>typedef ".$args{'typedef'}."</refname>\n"; @@ -1465,6 +1494,8 @@ sub dump_function($$) { $prototype =~ s/^static +//; $prototype =~ s/^extern +//; + $prototype =~ s/^fastcall +//; + $prototype =~ s/^asmlinkage +//; $prototype =~ s/^inline +//; $prototype =~ s/^__inline__ +//; $prototype =~ s/^#define +//; #ak added diff --git a/scripts/makeman b/scripts/makeman deleted file mode 100755 index db3af64..0000000 --- a/scripts/makeman +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/perl - -use strict; - -## Copyright (C) Michael Still (mikal@stillhq.com) -## Released under the terms of the GNU GPL -## -## A script to make or install the manpages extracted by split-man -## -## Arguements: $1 -- the word "convert" or "install" -## $2 -- the directory containing the SGML files for the manpages -## $3 -- the filename which contained the sgmldoc output -## (I need this so I know which manpages to convert) - -my($LISTING, $GENERATED, $INPUT, $OUTPUT, $front, $mode, $filename, $tmpdir); - -if($ARGV[0] eq ""){ - die "Usage: makeman [convert | install] <dir> <file>\n"; -} - -if( ! -d "$ARGV[1]" ){ - die "Output directory \"$ARGV[1]\" does not exist\n"; -} - -if($ENV{"TMPDIR"} ne ""){ - $tmpdir = $ENV{"TMPDIR"}; -} -else{ - $tmpdir = "/tmp"; -} - -if($ARGV[0] eq "convert"){ - open LISTING, "grep \"<refentrytitle>\" $ARGV[2] |"; - while(<LISTING>){ - s/<\/.*$//; - s/^.*>//; - s/\.sgml//; - s/struct //; - s/typedef //; - - chomp; - $filename = $_; - print "Processing $filename\n"; - - # Open the input file to extract the front matter, generate the man page, - # and open it, and the rearrange everything until it is happy - open INPUT, "< $ARGV[1]/$filename.sgml"; - $front = ""; - $mode = 0; - - # The modes used here are: - # mode = 0 - # <!-- BEGINFRONTTAG --> - # <!-- <bookinfo> mode = 1 - # <!-- <legalnotice> mode = 2 - # <!-- ...GPL or whatever... - # <!-- </legalnotice> mode = 4 - # <!-- </bookinfo> mode = 3 - # <!-- ENDFRONTTAG --> - # - # ...doco... - - # I know that some of the if statements in this while loop are in a funny - # order, but that is deliberate... - while(<INPUT>){ - if($mode > 0){ - s/<!-- //; - s/ -->//; - s/<docinfo>//i; - s<\/docinfo>//i; - s/^[ \t]*//i; - } - - if($mode == 2){ - if(/<para>/i){ - } - elsif(/<\/para>/i){ - $front = "$front.\\\" \n"; - } - elsif(/<\/legalnotice>/i){ - $mode = 4; - } - elsif(/^[ \t]*$/){ - } - else{ - $front = "$front.\\\" $_"; - } - } - - if($mode == 1){ - if(/<title>(.*)<\/title>/i){ - $front = "$front.\\\" This documentation was generated from the book titled \"$1\", which is part of the Linux kernel source.\n.\\\" \n"; - } - elsif(/<legalnotice>/i){ - $front = "$front.\\\" This documentation comes with the following legal notice:\n.\\\" \n"; - $mode = 2; - } - - elsif(/<author>/i){ - $front = "$front.\\\" Documentation by: "; - } - elsif(/<firstname>(.*)<\/firstname>/i){ - $front = "$front$1 "; - } - elsif(/<surname>(.*)<\/surname>/i){ - $front = "$front$1 "; - } - elsif(/<email>(.*)<\/email>/i){ - $front = "$front($1)"; - } - elsif(/\/author>/i){ - $front = "$front\n"; - } - - elsif(/<copyright>/i){ - $front = "$front.\\\" Documentation copyright: "; - } - elsif(/<holder>(.*)<\/holder>/i){ - $front = "$front$1 "; - } - elsif(/<year>(.*)<\/year>/i){ - $front = "$front$1 "; - } - elsif(/\/copyright>/i){ - $front = "$front\n"; - } - - elsif(/^[ \t]*$/ - || /<affiliation>/i - || /<\/affiliation>/i - || /<address>/i - || /<\/address>/i - || /<authorgroup>/i - || /<\/authorgroup>/i - || /<\/legalnotice>/i - || /<date>/i - || /<\/date>/i - || /<edition>/i - || /<\/edition>/i - || /<pubdate>/i - || /<\/pubdate>/i){ - } - else{ - print "Unknown tag in manpage conversion: $_"; - } - } - - if($mode == 0){ - if(/<bookinfo>/i){ - $mode = 1; - } - } - - if($mode == 4){ - if(/<\/bookinfo>/i){ - $mode = 3; - } - } - } - close INPUT; - - system("cd $ARGV[1]; docbook2man $filename.sgml; mv $filename.9 $tmpdir/$$.9\n"); - open GENERATED, "< $tmpdir/$$.9"; - open OUTPUT, "> $ARGV[1]/$filename.9"; - - print OUTPUT "$front"; - print OUTPUT ".\\\" For comments on the formatting of this manpage, please contact Michael Still <mikal\@stillhq.com>\n\n"; - while(<GENERATED>){ - print OUTPUT "$_"; - } - close OUTPUT; - close GENERATED; - - system("gzip -f $ARGV[1]/$filename.9\n"); - unlink("$tmpdir/$$.9"); - } -} -elsif($ARGV[0] eq "install"){ - system("mkdir -p /usr/local/man/man9/; install $ARGV[1]/*.9.gz /usr/local/man/man9/"); -} -else{ - die "Usage: makeman [convert | install] <dir> <file>\n"; -} - -print "Done\n"; diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index d54b52d..32197ef 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -47,32 +47,31 @@ do { \ sprintf(str + strlen(str), "*"); \ } while(0) -/* Looks like "usb:vNpNdlNdhNdcNdscNdpNicNiscNipN" */ -static int do_usb_entry(const char *filename, - struct usb_device_id *id, char *alias) +/* USB is special because the bcdDevice can be matched against a numeric range */ +/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */ +static void do_usb_entry(struct usb_device_id *id, + unsigned int bcdDevice_initial, int bcdDevice_initial_digits, + unsigned char range_lo, unsigned char range_hi, + struct module *mod) { - id->match_flags = TO_NATIVE(id->match_flags); - id->idVendor = TO_NATIVE(id->idVendor); - id->idProduct = TO_NATIVE(id->idProduct); - id->bcdDevice_lo = TO_NATIVE(id->bcdDevice_lo); - id->bcdDevice_hi = TO_NATIVE(id->bcdDevice_hi); - - /* - * Some modules (visor) have empty slots as placeholder for - * run-time specification that results in catch-all alias - */ - if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass)) - return 1; - + char alias[500]; strcpy(alias, "usb:"); ADD(alias, "v", id->match_flags&USB_DEVICE_ID_MATCH_VENDOR, id->idVendor); ADD(alias, "p", id->match_flags&USB_DEVICE_ID_MATCH_PRODUCT, id->idProduct); - ADD(alias, "dl", id->match_flags&USB_DEVICE_ID_MATCH_DEV_LO, - id->bcdDevice_lo); - ADD(alias, "dh", id->match_flags&USB_DEVICE_ID_MATCH_DEV_HI, - id->bcdDevice_hi); + + strcat(alias, "d"); + if (bcdDevice_initial_digits) + sprintf(alias + strlen(alias), "%0*X", + bcdDevice_initial_digits, bcdDevice_initial); + if (range_lo == range_hi) + sprintf(alias + strlen(alias), "%u", range_lo); + else if (range_lo > 0 || range_hi < 9) + sprintf(alias + strlen(alias), "[%u-%u]", range_lo, range_hi); + if (bcdDevice_initial_digits < (sizeof(id->bcdDevice_lo) * 2 - 1)) + strcat(alias, "*"); + ADD(alias, "dc", id->match_flags&USB_DEVICE_ID_MATCH_DEV_CLASS, id->bDeviceClass); ADD(alias, "dsc", @@ -90,7 +89,73 @@ static int do_usb_entry(const char *filename, ADD(alias, "ip", id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL, id->bInterfaceProtocol); - return 1; + + /* Always end in a wildcard, for future extension */ + if (alias[strlen(alias)-1] != '*') + strcat(alias, "*"); + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"%s\");\n", alias); +} + +static void do_usb_entry_multi(struct usb_device_id *id, struct module *mod) +{ + unsigned int devlo, devhi; + unsigned char chi, clo; + int ndigits; + + id->match_flags = TO_NATIVE(id->match_flags); + id->idVendor = TO_NATIVE(id->idVendor); + id->idProduct = TO_NATIVE(id->idProduct); + + devlo = id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO ? + TO_NATIVE(id->bcdDevice_lo) : 0x0U; + devhi = id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI ? + TO_NATIVE(id->bcdDevice_hi) : ~0x0U; + + /* + * Some modules (visor) have empty slots as placeholder for + * run-time specification that results in catch-all alias + */ + if (!(id->idVendor | id->bDeviceClass | id->bInterfaceClass)) + return; + + /* Convert numeric bcdDevice range into fnmatch-able pattern(s) */ + for (ndigits = sizeof(id->bcdDevice_lo) * 2 - 1; devlo <= devhi; ndigits--) { + clo = devlo & 0xf; + chi = devhi & 0xf; + if (chi > 9) /* it's bcd not hex */ + chi = 9; + devlo >>= 4; + devhi >>= 4; + + if (devlo == devhi || !ndigits) { + do_usb_entry(id, devlo, ndigits, clo, chi, mod); + break; + } + + if (clo > 0) + do_usb_entry(id, devlo++, ndigits, clo, 9, mod); + + if (chi < 9) + do_usb_entry(id, devhi--, ndigits, 0, chi, mod); + } +} + +static void do_usb_table(void *symval, unsigned long size, + struct module *mod) +{ + unsigned int i; + const unsigned long id_size = sizeof(struct usb_device_id); + + if (size % id_size || size < id_size) { + fprintf(stderr, "*** Warning: %s ids %lu bad size " + "(each on %lu)\n", mod->name, size, id_size); + } + /* Leave last one: it's the terminator. */ + size -= id_size; + + for (i = 0; i < size; i += id_size) + do_usb_entry_multi(symval + i, mod); } /* Looks like: ieee1394:venNmoNspNverN */ @@ -280,8 +345,8 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, do_table(symval, sym->st_size, sizeof(struct pci_device_id), do_pci_entry, mod); else if (sym_is(symname, "__mod_usb_device_table")) - do_table(symval, sym->st_size, sizeof(struct usb_device_id), - do_usb_entry, mod); + /* special case to handle bcdDevice ranges */ + do_usb_table(symval, sym->st_size, mod); else if (sym_is(symname, "__mod_ieee1394_device_table")) do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id), do_ieee1394_entry, mod); diff --git a/scripts/patch-kernel b/scripts/patch-kernel index 43af010..f2d47ca 100755 --- a/scripts/patch-kernel +++ b/scripts/patch-kernel @@ -46,6 +46,19 @@ # fix some whitespace damage; # be smarter about stopping when current version is larger than requested; # Randy Dunlap <rddunlap@osdl.org>, 2004-AUG-18. +# +# Add better support for (non-incremental) 2.6.x.y patches; +# If an ending version number if not specified, the script automatically +# increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found; +# however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented +# but must be specified fully. +# +# patch-kernel does not normally support reverse patching, but does so when +# applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z +# is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z). +# Randy Dunlap <rddunlap@osdl.org>, 2005-APR-08. + +PNAME=patch-kernel # Set directories from arguments, or use defaults. sourcedir=${1-/usr/src/linux} @@ -54,7 +67,7 @@ stopvers=${3-default} if [ "$1" == -h -o "$1" == --help -o ! -r "$sourcedir/Makefile" ]; then cat << USAGE -usage: patch-kernel [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] +usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ] source directory defaults to /usr/src/linux, patch directory defaults to the current directory, stopversion defaults to <all in patchdir>. @@ -73,6 +86,19 @@ do done # --------------------------------------------------------------------------- +# arg1 is filename +noFile () { + echo "cannot find patch file: ${patch}" + exit 1 +} + +# --------------------------------------------------------------------------- +backwards () { + echo "$PNAME does not support reverse patching" + exit 1 +} + +# --------------------------------------------------------------------------- # Find a file, first parameter is basename of file # it tries many compression mechanisms and sets variables to say how to get it findFile () { @@ -133,6 +159,28 @@ applyPatch () { return 0; } +# --------------------------------------------------------------------------- +# arg1 is patch filename +reversePatch () { + echo -n "Reversing $1 (${name}) ... " + if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir + then + echo "done." + else + echo "failed. Clean it up." + exit 1 + fi + if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] + then + echo "Aborting. Reject files found." + return 1 + fi + # Remove backup files + find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; + + return 0 +} + # set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; } grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE @@ -160,53 +208,57 @@ then EXTRAVER=$EXTRAVERSION fi EXTRAVER=${EXTRAVER%%[[:punct:]]*} - #echo "patch-kernel: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER" + #echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER" fi #echo "stopvers=$stopvers" if [ $stopvers != "default" ]; then STOPSUBLEVEL=`echo $stopvers | cut -d. -f3` STOPEXTRA=`echo $stopvers | cut -d. -f4` - #echo "STOPSUBLEVEL=$STOPSUBLEVEL, STOPEXTRA=$STOPEXTRA" + #echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/" else STOPSUBLEVEL=9999 STOPEXTRA=9999 fi -while : # incrementing SUBLEVEL (s in v.p.s) -do - if [ x$EXTRAVER != "x" ]; then +# This all assumes a 2.6.x[.y] kernel tree. +# Don't allow backwards/reverse patching. +if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then + backwards +fi + +if [ x$EXTRAVER != "x" ]; then CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" - else +else CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" - fi +fi + +if [ x$EXTRAVER != "x" ]; then + echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL" + patch="patch-${CURRENTFULLVERSION}" + findFile $patchdir/${patch} || noFile ${patch} + reversePatch ${patch} || exit 1 +fi +# now current is 2.6.x, with no EXTRA applied, +# so update to target SUBLEVEL (2.6.SUBLEVEL) +# and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested. +# If not ending sublevel is specified, it is incremented until +# no further sublevels are found. + +if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then +while : # incrementing SUBLEVEL (s in v.p.s) +do + CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" + EXTRAVER= if [ $stopvers == $CURRENTFULLVERSION ]; then echo "Stopping at $CURRENTFULLVERSION base as requested." break fi - while : # incrementing EXTRAVER (x in v.p.s.x) - do - EXTRAVER=$((EXTRAVER + 1)) - FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER" - #echo "... trying $FULLVERSION ..." - - patch=patch-$FULLVERSION - - # See if the file exists and find extension - findFile $patchdir/${patch} || break - - # Apply the patch and check all is OK - applyPatch $patch || break - - continue 2 - done - - EXTRAVER= SUBLEVEL=$((SUBLEVEL + 1)) FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL" - #echo "___ trying $FULLVERSION ___" + #echo "#___ trying $FULLVERSION ___" if [ $((SUBLEVEL)) -gt $((STOPSUBLEVEL)) ]; then echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)" @@ -214,14 +266,33 @@ do fi patch=patch-$FULLVERSION - # See if the file exists and find extension - findFile $patchdir/${patch} || break + findFile $patchdir/${patch} || noFile ${patch} # Apply the patch and check all is OK applyPatch $patch || break done -#echo "base all done" +#echo "#___sublevel all done" +fi + +# There is no incremental searching for extraversion... +if [ "$STOPEXTRA" != "" ]; then +while : # just to allow break +do +# apply STOPEXTRA directly (not incrementally) (x in v.p.s.x) + FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA" + #echo "#... trying $FULLVERSION ..." + patch=patch-$FULLVERSION + + # See if the file exists and find extension + findFile $patchdir/${patch} || noFile ${patch} + + # Apply the patch and check all is OK + applyPatch $patch || break + #echo "#___extraver all done" + break +done +fi if [ x$gotac != x ]; then # Out great user wants the -ac patches diff --git a/scripts/split-man b/scripts/split-man deleted file mode 100755 index 03897fe..0000000 --- a/scripts/split-man +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/perl - -use strict; - -## Copyright (C) Michael Still (mikal@stillhq.com) -## Released under the terms of the GNU GPL -## -## Hoon through the specified DocBook SGML file, and split out the -## man pages. These can then be processed into groff format, and -## installed if desired... -## -## Arguements: $1 -- the name of the sgml file -## $2 -- the directory to put the generated SGML files in -## $3 -- kernel version - -my($SGML, $REF, $front, $refdata, $mode, $filename); - -if(($ARGV[0] eq "") || ($ARGV[1] eq "") || ($ARGV[2] eq "")){ - die "Usage: split-man <sgml file> <output dir> <kernel version>\n"; -} - -open SGML, "< $ARGV[0]" or die "Could not open input file \"$ARGV[0]\"\n"; -if( ! -d "$ARGV[1]" ){ - die "Output directory \"$ARGV[1]\" does not exist\n"; -} - -# Possible modes: -# 0: Looking for input I care about -# 1: Inside book front matter -# 2: Inside a refentry -# 3: Inside a refentry, and we know the filename - -$mode = 0; -$refdata = ""; -$front = ""; -while(<SGML>){ - # Starting modes - if(/<bookinfo>/ || /<docinfo>/){ - $mode = 1; - } - elsif(/<refentry>/){ - $mode = 2; - } - elsif(/<refentrytitle><phrase[^>]*>([^<]*)<.*$/){ - $mode = 3; - $filename = $1; - - $filename =~ s/struct //; - $filename =~ s/typedef //; - - print "Found manpage for $filename\n"; - open REF, "> $ARGV[1]/$filename.sgml" or - die "Couldn't open output file \"$ARGV[1]/$filename.sgml\": $!\n"; - print REF <<EOF; -<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> - -<!-- BEGINFRONTTAG: The following is front matter for the parent book --> -$front -<!-- ENDFRONTTAG: End front matter --> - -$refdata -EOF - $refdata = ""; - } - - # Extraction - if($mode == 1){ - chomp $_; - $front = "$front<!-- $_ -->\n"; - } - elsif($mode == 2){ - $refdata = "$refdata$_"; - } - elsif($mode == 3){ - # There are some fixups which need to be applied - if(/<\/refmeta>/){ - print REF "<manvolnum>9</manvolnum>\n"; - } - if(/<\/refentry>/){ - print REF <<EOF; -<refsect1><title>About this document</title> -<para> -This documentation was generated with kernel version $ARGV[2]. -</para> -</refsect1> -EOF - } - - # For some reason, we title the synopsis twice in the main DocBook - if(! /<title>Synopsis<\/title>/){ - if(/<refentrytitle>/){ - s/struct //; - s/typedef //; - } - - print REF "$_"; - } - } - - # Ending modes - if(/<\/bookinfo>/ || /<\/docinfo>/){ - $mode = 0; - } - elsif(/<\/refentry>/){ - $mode = 0; - close REF; - } -} - -# And make sure we don't process this unnessesarily -$ARGV[0] =~ s/\.sgml/.9/; -`touch $ARGV[0]`; |