[RFC ;-)]: some more flexible way to load localized files (hints, help, etc)

Andrew V. Samoilov sav at bcs.zp.ua
Fri May 4 13:46:30 UTC 2001


This patch provide more flexible method to load localized files from <mc_home>
directory. There is a new function 
char *load_mc_home_file (const char * filename, char ** allocated_filename)
derived from cmd.c:get_random_hint(). It use next algorithm. 
Let mc_home is "/usr/lib/mc", filename is "mc.hlp" and guess_message_value ()
returned "russian_cis.cl8koi8r".
    1) It try to load             "/usr/lib/mc/mc.hlp.russian_cis.cl8koi8r"
    2) If 1) fails it try to load "/usr/lib/mc/mc.hlp.ru"
    3) If 3) fails it try to load "/usr/src/mc/mc.hlp" (default)
If allocated_filename is not NULL it store a pointer to a filename loaded 
at last try and must be g_free()d after use.

Now it can be used to load hint and help files. Here is an absent a ChangeLog 
entry becase this letter is a RFC only.  Tomasz Kloczko offered to rewrite
help system from scratch and a second reason is my English.

Good luck!
Andrew.

Index: gtkedit/editcmd.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/gtkedit/editcmd.c,v
retrieving revision 1.27
diff -u -r1.27 editcmd.c
--- gtkedit/editcmd.c	2000/10/30 18:35:32	1.27
+++ gtkedit/editcmd.c	2000/11/01 11:01:43
@@ -165,9 +165,7 @@
 
 void edit_help_cmd (WEdit * edit)
 {
-    char *hlpdir = concat_dir_and_file (mc_home, _("mc.hlp"));
-    interactive_display (hlpdir, "[Internal File Editor]");
-    free (hlpdir);
+    interactive_display (NULL, "[Internal File Editor]");
     edit->force |= REDRAW_COMPLETELY;
 }
 
Index: src/view.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/view.c,v
retrieving revision 1.40
diff -u -r1.40 view.c
--- src/view.c	2000/04/18 11:19:19	1.40
+++ src/view.c	2000/10/30 11:46:00
@@ -1830,9 +1838,7 @@
 /* Real view only */
 static void help_cmd (void)
 {
-    char *hlpfile = concat_dir_and_file (mc_home, _("mc.hlp"));
-    interactive_display (hlpfile, "[Internal File Viewer]");
-    g_free (hlpfile);
+    interactive_display (NULL, "[Internal File Viewer]");
     /*
     view_refresh (0);
     */
Index: src/dlg.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/dlg.c,v
retrieving revision 1.31
diff -u -r1.31 dlg.c
--- src/dlg.c	2000/04/25 08:57:06	1.31
+++ src/dlg.c	2000/10/30 11:48:42
@@ -636,8 +636,6 @@
 
 static INLINE void dialog_handle_key (Dlg_head *h, int d_key)
 {
-   char *hlpfile;
-
     switch (d_key){
     case KEY_LEFT:
     case KEY_UP:
@@ -650,9 +648,7 @@
 	break;
 
     case KEY_F(1):
-        hlpfile = concat_dir_and_file (mc_home, _("mc.hlp"));
-	interactive_display (hlpfile, h->help_ctx);
-        g_free (hlpfile);
+	interactive_display (NULL, h->help_ctx);
 	do_refresh ();
 	break;
 
Index: src/tree.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/tree.c,v
retrieving revision 1.23
diff -u -r1.23 tree.c
--- src/tree.c	2000/10/30 11:51:34	1.23
+++ src/tree.c	2000/10/30 11:52:23
@@ -651,9 +651,7 @@
 
 static void tree_help_cmd (void)
 {
-    char *hlpfile = concat_dir_and_file (mc_home, _("mc.hlp"));
-    interactive_display (hlpfile,  "[Directory Tree]");
-    g_free (hlpfile);
+    interactive_display (NULL,  "[Directory Tree]");
 }
 
 static int tree_copy_cmd (WTree *tree)
Index: src/help.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/help.c,v
retrieving revision 1.9
diff -u -p -r1.9 help.c
--- src/help.c	2000/10/30 11:54:21	1.9
+++ src/help.c	2000/10/31 19:00:52
@@ -759,14 +759,26 @@ interactive_display_finish (void)
 void
 interactive_display (char *filename, char *node)
 {
-    WButtonBar *help_bar;
-    Widget     *md;
-    
-    if ((data = load_file (filename)) == 0){
+    WButtonBar	*help_bar;
+    Widget	*md;
+    char	*hlpfile = filename;
+
+    if (filename)
+	data = load_file (filename);
+    else
+	data = load_mc_home_file ("mc.hlp", &hlpfile);
+
+    if (data == NULL){
 	message (1, MSG_ERROR, _(" Can't open file %s \n %s "),
-		 filename, unix_error_string (errno));
-	return;
+		 hlpfile, unix_error_string (errno));
     }
+
+    if (!filename)
+	g_free (hlpfile);
+
+    if (!data)
+	return;
+
     if (!(main_node = search_string (data, node))){
 	message (1, MSG_ERROR, _(" Can't find node %s in help file "), node);
 	interactive_display_finish ();
Index: src/cmd.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/cmd.c,v
retrieving revision 1.66
diff -u -p -r1.66 cmd.c
--- src/cmd.c	2000/09/01 13:59:07	1.66
+++ src/cmd.c	2001/05/03 19:24:16
@@ -1201,9 +1201,7 @@ void other_symlink_cmd (void)
 
 void help_cmd (void)
 {
-   char *hlpfile = concat_dir_and_file (mc_home, "mc.hlp");
-   interactive_display (hlpfile, "[main]");
-   g_free (hlpfile);
+   interactive_display (NULL, "[main]");
 }
 
 void view_panel_cmd (void)
@@ -1269,8 +1267,6 @@ char *guess_message_value (unsigned want
 char *get_random_hint (void)
 {
     char *data, *result, *eol;
-    char *hintfile_base, *hintfile;
-    char *lang;
     int  len;
     int start;
     
@@ -1294,24 +1290,7 @@ char *get_random_hint (void)
     last_sec = tv.tv_sec;
 #endif
 
-    hintfile_base = concat_dir_and_file (mc_home, MC_HINT);
-    lang = guess_message_value (0);
-
-    hintfile = g_strdup_printf ("%s.%s", hintfile_base, lang);
-    data = load_file (hintfile);
-    g_free (hintfile);
-
-    if (!data) {
-	hintfile = g_strdup_printf ("%s.%.2s", hintfile_base, lang);
-	data = load_file (hintfile);
-	g_free (hintfile);
-
-	if (!data)
-	    data = load_file (hintfile_base);
-    }
-
-    g_free (lang);
-    g_free (hintfile_base);
+    data = load_mc_home_file (MC_HINT, NULL));
     if (!data)
 	return 0;
 
Index: src/util.c
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/util.c,v
retrieving revision 1.33
diff -u -p -r1.33 util.c
--- src/util.c	2001/01/03 12:00:25	1.33
+++ src/util.c	2001/05/04 13:06:45
@@ -589,6 +589,43 @@ char *load_file (char *filename)
     }
 }
 
+char *load_mc_home_file (const char *filename, char ** allocated_filename)
+{
+    char *hintfile_base, *hintfile;
+    char *lang;
+    char *data;
+
+    hintfile_base = concat_dir_and_file (mc_home, filename);
+    lang = guess_message_value (0);
+
+    hintfile = g_strdup_printf ("%s.%s", hintfile_base, lang);
+    data = load_file (hintfile);
+
+    if (!data) {
+	g_free (hintfile);
+	hintfile = g_strdup_printf ("%s.%.2s", hintfile_base, lang);
+	data = load_file (hintfile);
+
+	if (!data) {
+	    g_free (hintfile);
+	    hintfile = hintfile_base;
+	    data = load_file (hintfile_base);
+	}
+    }
+
+    g_free (lang);
+
+    if (hintfile != hintfile_base)
+	g_free (hintfile_base);
+
+    if (allocated_filename)
+	*allocated_filename = hintfile;
+    else
+	g_free (hintfile);
+
+    return data;
+}
+
 /* Check strftime() results. Some systems (i.e. Solaris) have different
 short-month-name sizes for different locales */ 
 size_t i18n_checktimelength (void)
Index: src/util.h
===================================================================
RCS file: /home/sav/.cvsroot/mc/src/util.h,v
retrieving revision 1.22
diff -u -p -r1.22 util.h
--- src/util.h	2000/06/15 09:18:29	1.22
+++ src/util.h	2001/05/04 13:08:23
@@ -46,6 +46,7 @@ int set_int (char *, char *, int);
 int get_int (char *, char *, int);
 
 char *load_file (char *filename);
+char *load_mc_home_file (const char *filename, char ** allocated_filename);
 
 #include "fs.h"
 #ifndef S_ISLNK




More information about the mc-devel mailing list