lynx-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

lynx-dev [-dev.12] experimental text entry fields patch (updated)


From: Kim DeVaughn
Subject: lynx-dev [-dev.12] experimental text entry fields patch (updated)
Date: Tue, 5 Jan 1999 13:21:03 -0800

|    I made a patch for [1]Lynx the textual web browser. The patch allows
|    you to put the contents of a textarea (found in forms in html
|    documents) into a file for easier composition.

|    The version of the patch itself is 0.1.2 (19 nov 1998). It is an alpha
|    release. It made it relative to Lynx2.8.1rel.1, other versions might
|    work.

OK ... I have this patch working with 2.8.2-dev.12 ... the rejects caused
by the rev change were pretty trivial to fix.

I've attached the patch fixed for -dev.12 below, just to save anyone else
the hassle of doing the fixups themselves, if they want to play around with
this feature.  No other changes have been made, at this time.

Before it gets included in any distrubution, I think it would be polite to
get the author's permission to use it, even though there were no restrict-
ions placed on the code, and feedback was explicitly asked for.


A few comments ...

 1. After returning from the editor, the screen needs a full refresh
    performed (manually, ^V ^L, if your cursor was still positioned in
    the text area when ^V % was issued).  This may be dependent on the
    lib or platform being used; I'm using slang 1.2.2 on a FreeBSD
    2.2.8-STABLE box.

 2. The edited text is *not* displayed in the text area after returning
    from the editor.  When the ^V & command is issued, the word CONVERTED
    is placed at the start of that text area.

 3. On entry to the editor, the file has the same number of blank lines
    as the field had, though there is no visual indication of this
    (which may well be editor dependent) other than issuing the editor
    cmd that moves the cursor to the EOF.

    There's also no indication of allowable/maximum line length.  I'm
    not sure how this could be provided, in any clean way.

 4. As the author says in the notes on his web-page, backup~ files are
    not cleaned up.

 5. The author seems to imply that one can "mark" (^V &) several text
    fields, then edit them all at once using the "edit" command (^V %).

    I dunno how that would work, and indeed haven't been able to come
    close to doing anything like that in my limited testing.  I am
    probably misinterpreting what the author meant, where he said:

    "* The number of files is limited. Size of files is limited."

 6. The author says: "After the textarea is in a file you can't put it
    back; you can't revert."

    Again, I don't quite understand this.  Multiple invocations of the
    editor (^V %) on the same text field work.  Subsequent changes made,
    to the text, *do* get picked up.

    Perhaps he means that you can't totally "undo" a textfield entry
    (but you can always ^V % again, and erase the lines in the editor).

 7. In text areas that are "preloaded" with some text, that text *does*
    get transfered to the editor (though when ^V & is entered, it is
    cleared from the textarea on the rendered page itself).

Anyway ... it seems like this is a good start to getting this kind of a
feature working in lynx.  It has a few rough edges, but even in its
current state, I think I'll be including it in my lynx builds.

Very useful ...!

BTW, all my testing was done with text entry fields on submission pages
at the Internet Movie DataBase (http://www.imdb.com/>.  Other pages may
or may not work as well as these seem to ...

/kim


Against 2.8.2-dev.12:

##----- snip -----##
This is an update to the 0.1.2 version of the patch, so let's call it
0.1.3 (05 Jan 99).

The only things changed were to fix it to apply to the 2.8.2-dev.12
version of lynx, and to delete trailing whitespace in a few places.
Only minor tweaks were needed.

/kim  (address@hidden)

-------------------------------------------------------------------------------

 This is patch version 0.1.2 (19 Nov 98) for textarea + file editing
 It is made versus lynx2.8.1rel1
 To use it put lines like these in lynx.cfg:
 KEYMAP:%:CONVERTEDIT
 KEYMAP:&:CONVERT
 DEFAULT_EDITOR:joe

 Your default editor may need to be set in your ~/.lynxrc

 Improvements in this patch from 0.1.0
 are warning when the file is too big, warning when
 the filename array is full, and a statusline message indcating
 when your in a converted area.

 From 0.1.1:
 Fixed status line message.

diff -uNr lynx-2.8.2-dev.12.orig/src/GridText.c 
lynx-2.8.2-dev.12+kd/src/GridText.c
--- lynx-2.8.2-dev.12.orig/src/GridText.c       Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/GridText.c Tue Jan  5 10:40:09 1999
@@ -2,6 +2,7 @@
 **             ===============================
 */
 
+#include <myfile.h>
 #include <HTUtils.h>
 #include <HTString.h>
 #include <HTFont.h>
@@ -6796,6 +6797,7 @@
 
     a->input_field = f;
 
+    f->filename = NULL;
     f->select_list = 0;
     f->number = HTFormNumber;
     f->disabled = (HTFormDisabled ? TRUE : I->disabled);
@@ -7306,6 +7308,82 @@
     return (-1);
 }
 
+/* ARGSx, how compatible
+ * perhaps m4 should be used, it's turing equivalent
+ */
+/* Puts a textarea into a file
+*/
+/* TODO: add disabled form handling, ...
+ */
+PUBLIC void HText_FileForm ARGS1(
+       struct link *,  form_link) /* like in change_form_link */
+{
+       struct stat B;
+       FormInfo *form = form_link->form;
+       TextAnchor *anchor_ptr;
+       int form_number = form->number;
+       const char * const textareaname = form_link->form->name;
+       /* This identfies which textarea if more than one*/
+       FILE *fp;
+       BOOLEAN firstanchor = TRUE;
+       /* the first line of the textarea wll have a message
+        * use this flag to tell which is first
+        */
+
+       if (g_mytmp_i == g_mytmp_i_max)
+       {
+               HTInfoMsg("Can't convert, file holder full.");
+       } else {
+
+       g_mytmp_i++; /* starts out as -1 */
+
+       /* FIXME how much to malloc? No objects or garbage collector is 
annoying*/
+       fp = LYOpenTemp(g_mytmp[g_mytmp_i] = malloc(200), ".txt", "w");
+       if (strlen(g_mytmp[g_mytmp_i]) == 200)
+               HTAlert("Memory Violation :8q29");
+
+       /*
+        *  Reset anchor->ptr.
+        */
+       anchor_ptr = HTMainText->first_anchor;
+       /*
+        *  Go through list of anchors and make file.
+        */
+       while (anchor_ptr) {
+               /* find the right anchors to work with */
+               if (anchor_ptr->link_type == INPUT_ANCHOR &&
+                 anchor_ptr->input_field->number == form_number &&
+                 !strcmp( anchor_ptr->input_field->name, textareaname) )
+               {
+                       /* Record file name in TextAnchor data */
+                       anchor_ptr->input_field->filename = g_mytmp[g_mytmp_i];
+
+                       /*write to file*/
+                       fputs (anchor_ptr->input_field->value, fp);
+                       fputc ('\n', fp);
+                       if (firstanchor) {
+                               firstanchor = FALSE;
+                               /* put message into first line
+                                * StrAllocCopy, blecch no GC
+                                */
+                               StrAllocCopy (anchor_ptr->input_field->value, 
"CONVERTED");
+                       } else {
+                               /* clear line */
+                               StrAllocCopy (anchor_ptr->input_field->value, 
"");
+                       }
+               }
+               anchor_ptr = anchor_ptr->next;
+       }
+
+       fclose (fp);
+       stat (g_mytmp[g_mytmp_i], &B);
+       if (B.st_size > g_maxfile_size) { /* too big */
+               HTAlert("File too big, won't be submit correctly");
+       }
+
+       }/* unindented g_mytmp_i_max branch */
+}
+
 PUBLIC void HText_SubmitForm ARGS4(
        FormInfo *,     submit_item,
        document *,     doc,
@@ -7339,6 +7417,10 @@
     char *val_used = "";
     char *copied_val_used = NULL;
     char *copied_name_used = NULL;
+    BOOLEAN freeval = FALSE;
+    BOOLEAN skiparea = FALSE;
+    FILE *fp = NULL;    /* used for reading textarea file */
+    char *areaname = ""; /* name of textarea (do all textarea have a name?) */
 
     CTRACE(tfp, "FIXME:SubmitForm\n");
     if (!HTMainText)
@@ -7453,15 +7535,49 @@
     while (anchor_ptr) {
        if (anchor_ptr->link_type == INPUT_ANCHOR) {
            if (anchor_ptr->input_field->number == form_number) {
-
                char *p;
                char * val;
+
+               if (skiparea) {
+                       /* Can two textareas  in the same form have the same 
name */
+                       /* Are textarea's always made of consecutive 
textanchors? */
+                       if (!strcmp(anchor_ptr->input_field->name, areaname) ) {
+                               /* from bottom of while: */
+                               if (anchor_ptr == HTMainText->last_anchor)
+                                   break;
+
+                               anchor_ptr = anchor_ptr->next;
+                               continue;
+                       } else {
+                               skiparea = FALSE;
+                       }
+               }
+               
                form_ptr = anchor_ptr->input_field;
                val = form_ptr->cp_submit_value != NULL ?
                                    form_ptr->cp_submit_value : form_ptr->value;
                field_has_8bit = NO;
                field_has_special = NO;
 
+               /* handle textarea file
+                * only textareas have filenames
+                */
+               if (anchor_ptr->input_field->filename != NULL) {
+                       struct stat B;
+                       areaname = anchor_ptr->input_field->name;
+                       stat (anchor_ptr->input_field->filename, &B);
+                       if (B.st_size > g_maxfile_size) { /* too big */
+                               HTAlert("File too big"); /*FIXME better 
message*/
+                       } else {
+                               fp = fopen (anchor_ptr->input_field->filename, 
"r");
+                               val = malloc (B.st_size * (sizeof (char)));
+                               fread (val, 1, B.st_size, fp);
+                               fclose (fp);
+                               freeval = TRUE;
+                       }
+                       skiparea = TRUE;
+               }
+
                for (p = val;
                     p && *p && !(field_has_8bit && field_has_special);
                     p++)
@@ -7526,12 +7642,17 @@
                } else {
                    target_cs = -1; /* don't know what to do */
                }
+               if (freeval) {
+                       free (val);
+                       freeval = FALSE;
+               }
 
            } else if (anchor_ptr->input_field->number > form_number) {
                break;
            }
        }
 
+
        if (anchor_ptr == HTMainText->last_anchor)
            break;
 
@@ -7626,6 +7747,11 @@
 
     out_csname = target_csname;
 
+    skiparea = FALSE;
+    fp = NULL;
+    areaname = "";
+
+
     /*
      *  Reset anchor->ptr.
      */
@@ -7638,6 +7764,21 @@
            if (anchor_ptr->input_field->number == form_number) {
                char *p;
                int out_cs;
+
+               if (skiparea) {
+                       /* Can two textareas  in the same form have the same 
name */
+                       if (! strcmp(anchor_ptr->input_field->name, areaname) ) 
{
+                               /* from bottom of while: */
+                               if (anchor_ptr == HTMainText->last_anchor)
+                                   break;
+
+                               anchor_ptr = anchor_ptr->next;
+                               continue;
+                       } else {
+                               skiparea = FALSE;
+                       }
+               }
+
                form_ptr = anchor_ptr->input_field;
 
                if (form_ptr->type != F_TEXTAREA_TYPE)
@@ -7691,6 +7832,27 @@
                        val_used = form_ptr->value;
                    }
 
+                   /* handle textarea file
+                    * only textareas have filenames
+                    */
+                   if (anchor_ptr->input_field->filename != NULL) {
+                       struct stat B;
+                       areaname = anchor_ptr->input_field->name;
+                       stat (anchor_ptr->input_field->filename, &B);
+                       if (B.st_size > g_maxfile_size) { /* too big */
+                               /* FIXME */
+                       } else {
+                               /* I could change the strings in this code
+                               * to streams.
+                               */
+                               fp = fopen (anchor_ptr->input_field->filename, 
"r");
+                               val_used = malloc (B.st_size * (sizeof (char)));
+                               freeval = TRUE;
+                               fread (val_used, 1, B.st_size, fp);
+                               fclose (fp);
+                       }
+                       skiparea = TRUE;
+                   }
                    /*
                     *  Charset-translate value now, because we need
                     *  to know the charset parameter for multipart
@@ -7869,6 +8031,9 @@
                                form_ptr->type);
                }
 
+               /*  Add to query, see vars- name_used val_used
+                *  escaped1 escaped2
+                */
                switch(form_ptr->type) {
 
                case F_RESET_TYPE:
@@ -8194,6 +8359,11 @@
            } else if (anchor_ptr->input_field->number > form_number) {
                break;
            }
+       }
+
+       if (freeval) {
+               free (val_used);
+               freeval = FALSE;
        }
 
        if (anchor_ptr == HTMainText->last_anchor)
diff -uNr lynx-2.8.2-dev.12.orig/src/GridText.h 
lynx-2.8.2-dev.12+kd/src/GridText.h
--- lynx-2.8.2-dev.12.orig/src/GridText.h       Thu Dec  3 10:28:20 1998
+++ lynx-2.8.2-dev.12+kd/src/GridText.h Tue Jan  5 08:38:34 1999
@@ -203,6 +203,8 @@
 extern void HText_trimHightext PARAMS((
        HText *         text,
        BOOLEAN         final));
+extern PUBLIC void HText_FileForm PARAMS((
+       struct link *   form_link));
 extern void HText_SubmitForm PARAMS((
        FormInfo *      submit_item,
        document *      doc,
diff -uNr lynx-2.8.2-dev.12.orig/src/HTForms.h 
lynx-2.8.2-dev.12+kd/src/HTForms.h
--- lynx-2.8.2-dev.12.orig/src/HTForms.h        Fri Jul 24 20:01:03 1998
+++ lynx-2.8.2-dev.12+kd/src/HTForms.h  Tue Jan  5 10:40:10 1999
@@ -1,4 +1,3 @@
-
 #ifndef HTFORMS_H
 #define HTFORMS_H
 
@@ -53,9 +52,11 @@
  * A pointer to this structure is in the TextAnchor struct.
  */
 typedef struct _FormInfo {
+       char *                  filename;  /* if textarea converted to file,
+                                           * NULL if not. Does this go here? */
        char *                  name;      /* the name of the link */
        int                     number;    /* which form is the link within */
-       int                     type;      /* string, int, etc. */
+       int                     type;      /* string, int, etc.  Huh? */
        char *                  value;     /* user entered string data */
        char *                  orig_value;/* the original value */
        int                     size;      /* width on the screen */
diff -uNr lynx-2.8.2-dev.12.orig/src/LYKeymap.c 
lynx-2.8.2-dev.12+kd/src/LYKeymap.c
--- lynx-2.8.2-dev.12.orig/src/LYKeymap.c       Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/LYKeymap.c Tue Jan  5 09:11:23 1999
@@ -41,6 +41,9 @@
 /* the character gets 1 added to it before lookup,
  * so that EOF maps to 0
  */
+/* The values here are defaults and are changed by a
+ * KEYMAP command in lynx.cfg
+ */
 unsigned short keymap[KEYMAP_SIZE] = {
 
 0,
@@ -531,6 +534,10 @@
        CONST char *name;
        CONST char *doc;
 };
+
+/* these entries correspond to #defined vars in LYKeyMap.h (LYK_*),
+ * those values are used in e.g. a switch statement in LYMainLoop.c
+ */
 PRIVATE struct rmap revmap[] = {
 { "UNMAPPED",          NULL },
 { "1",                 NULL },
@@ -607,6 +614,8 @@
 { "SWITCH_DTD",                "switch between two ways of parsing HTML" },
 { "ELGOTO",            "edit the current link's URL or ACTION and go to it" },
 { "CHANGE_LINK",       "force reset of the current link on the page" },
+{ "CONVERT",           "Puts a set of textarea fields into a file to edit"},
+{ "CONVERTEDIT",       "Edits file generated by CONVERTion"},
 #ifdef USE_EXTERNALS
 { "EXTERN",            "run external program with url" },
 #endif
diff -uNr lynx-2.8.2-dev.12.orig/src/LYKeymap.h 
lynx-2.8.2-dev.12+kd/src/LYKeymap.h
--- lynx-2.8.2-dev.12.orig/src/LYKeymap.h       Thu Dec 24 03:27:23 1998
+++ lynx-2.8.2-dev.12+kd/src/LYKeymap.h Tue Jan  5 08:57:20 1999
@@ -105,15 +105,25 @@
 #define       LYK_SWITCH_DTD    72
 #define       LYK_ELGOTO        73
 #define       LYK_CHANGE_LINK   74
+#define       LYK_CONVERT       75 /* convert textarea to file.
+                                   * (no revert available).
+                                   * FIXME what number should this be anyway?
+                                   * #defines are a waste of time to use.
+                                   * This method of synchronizing the #defines
+                                   * and the order of entries in revmap is
+                                   * crappy, at least enum should be used;
+                                   * imagine using a preprocessor in other
+                                   * programming languages */
+#define                LYK_EDITCONVERT 76
 
 #ifdef USE_EXTERNALS
-#define       LYK_EXTERN        75
+#define       LYK_EXTERN        77
 #if defined(VMS) || defined(DIRED_SUPPORT)
-#define       LYK_DIRED_MENU    76
+#define       LYK_DIRED_MENU    78
 #endif /* VMS || DIRED_SUPPORT */
 #else  /* USE_EXTERNALS */
 #if defined(VMS) || defined(DIRED_SUPPORT)
-#define       LYK_DIRED_MENU    75
+#define       LYK_DIRED_MENU    77
 #endif /* VMS || DIRED_SUPPORT */
 #endif /* !defined(USE_EXTERNALS) */
 
diff -uNr lynx-2.8.2-dev.12.orig/src/LYMain.c lynx-2.8.2-dev.12+kd/src/LYMain.c
--- lynx-2.8.2-dev.12.orig/src/LYMain.c Sat Dec 26 12:50:01 1998
+++ lynx-2.8.2-dev.12+kd/src/LYMain.c   Tue Jan  5 10:40:10 1999
@@ -1,3 +1,4 @@
+#include <myfile.h>
 #include <HTUtils.h>
 #include <HTTP.h>
 #include <HTParse.h>
@@ -504,6 +505,12 @@
        FREE(links[i].lname);
     }
     nlinks = 0;
+
+    /* g_mytmp_i starts program as -1 */
+    for (i = 0; i <= g_mytmp_i ; i++) {
+       free (g_mytmp[i]);
+    }
+    g_mytmp_i = -1;
 
     return;
 }
diff -uNr lynx-2.8.2-dev.12.orig/src/LYMainLoop.c 
lynx-2.8.2-dev.12+kd/src/LYMainLoop.c
--- lynx-2.8.2-dev.12.orig/src/LYMainLoop.c     Sat Dec 26 12:50:01 1998
+++ lynx-2.8.2-dev.12+kd/src/LYMainLoop.c       Tue Jan  5 10:40:10 1999
@@ -1,3 +1,4 @@
+#include <myfile.h>
 #include <HTUtils.h>
 #include <HTAccess.h>
 #include <HTParse.h>
@@ -1418,7 +1419,10 @@
                        break;
                    case F_TEXT_TYPE:
                    case F_TEXTAREA_TYPE:
-                       if (links[curdoc.link].form->disabled == YES)
+                       if (links[curdoc.link].form->type == F_TEXTAREA_TYPE &&
+                           links[curdoc.link].form->filename != NULL)
+                           statusline("This textarea is a file.");
+                       else if (links[curdoc.link].form->disabled == YES)
                            statusline(FORM_LINK_TEXT_UNM_MSG);
                        else
                            statusline(FORM_LINK_TEXT_MESSAGE);
@@ -4263,6 +4267,62 @@
                goto new_cmd;
            }
            break;
+
+       case LYK_CONVERT:       /* put textarea text into file */
+               /*if curent link is part of a textarea*/
+               if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+                   links[curdoc.link].form->type == F_TEXTAREA_TYPE)
+               {
+                       /* Check to see if already a file */
+                       if (links[curdoc.link].form->filename == NULL) {
+                               {
+                               /* I guess I have to call a function in 
GridText.c to access
+                                * the objects I need, is this supposed to be a 
module?
+                                */
+                                HText_FileForm( &links[curdoc.link] );
+                                cmd = LYK_REFRESH;
+                                goto new_cmd;
+                               }
+                       } else {
+                               HTInfoMsg("This textarea is already file");
+                       }
+               } else { /* not a textarea */
+                       HTInfoMsg("CONVERT: Not in a textarea");
+               }
+               break;
+
+       case LYK_EDITCONVERT: /* edit file of a textarea*/
+               /*if curent link is part of a textarea*/
+               if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+                       links[curdoc.link].form->type == F_TEXTAREA_TYPE)
+               {
+                       char com[200]; /* groan */
+                       /* Check to see if in a file */
+                       if (links[curdoc.link].form->filename != NULL) {
+                               struct stat B;
+                               /* stop screen */
+                               stop_curses();
+                               /* editor should be lynx.cfg option */
+                               /* StrAllocCopy? */
+                               snprintf(com, 200, "%s %s", editor, 
links[curdoc.link].form->filename);
+                               system(com);
+                               /* start screen */
+                               start_curses();
+
+                               stat (links[curdoc.link].form->filename, &B);
+                               if (B.st_size > g_maxfile_size) { /* too big */
+                                       HTAlert("File too big, won't be submit 
correctly");
+                               }
+
+
+                       } else {
+                               /*FIXME: put strings definitions into constant 
area*/
+                               HTInfoMsg("This textarea not in a file");
+                       }
+               } else { /* not a textarea */
+                       HTInfoMsg("CONVERT: Not in a textarea");
+               }
+               break;
 
        case LYK_PRINT:  /* print the file */
            if (LYValidate) {
diff -uNr lynx-2.8.2-dev.12.orig/src/LYUtils.c 
lynx-2.8.2-dev.12+kd/src/LYUtils.c
--- lynx-2.8.2-dev.12.orig/src/LYUtils.c        Thu Dec 24 03:27:23 1998
+++ lynx-2.8.2-dev.12+kd/src/LYUtils.c  Tue Jan  5 10:40:11 1999
@@ -5764,8 +5764,12 @@
                CTRACE(tfp, "...LYRemoveTemp done(%d)%s\n", code,
                       (p->file != 0) ? ", closed" : "");
                CTRACE_FLUSH(tfp);
-               if (p->file != 0)
-                   fclose(p->file);
+               if (p->file != 0) {
+                   struct stat B;
+                   stat(p->name, &B);
+                   if (!ENOENT)
+                       fclose(p->file);
+               }
                free(p->name);
                free(p);
                break;
diff -uNr lynx-2.8.2-dev.12.orig/src/makefile.in 
lynx-2.8.2-dev.12+kd/src/makefile.in
--- lynx-2.8.2-dev.12.orig/src/makefile.in      Wed Dec 16 13:56:42 1998
+++ lynx-2.8.2-dev.12+kd/src/makefile.in        Tue Jan  5 10:40:11 1999
@@ -57,7 +57,7 @@
 COMPRESS_EXT   address@hidden@
 
 CHARTRANS_OBJS=UCdomap.o UCAux.o UCAuto.o
-OBJS=  LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
+OBJS= myfile.o  LYClean.o LYShowInfo.o LYEdit.o LYStrings.o \
 LYMail.o HTAlert.o GridText.o LYGetFile.o \
 LYMain.o LYMainLoop.o LYCurses.o LYBookmark.o LYUtils.o \
 LYOptions.o LYReadCFG.o LYSearch.o LYHistory.o \
diff -uNr lynx-2.8.2-dev.12.orig/src/myfile.c lynx-2.8.2-dev.12+kd/src/myfile.c
--- lynx-2.8.2-dev.12.orig/src/myfile.c Wed Dec 31 16:00:00 1969
+++ lynx-2.8.2-dev.12+kd/src/myfile.c   Tue Jan  5 10:40:11 1999
@@ -0,0 +1,7 @@
+
+int g_mytmp_i = -1;
+char *g_mytmp[100];
+const int g_mytmp_i_max = 99;
+const int g_maxfile_size = 20000;
+
+/* g_mytmp is freed in free_lynx_globals */
diff -uNr lynx-2.8.2-dev.12.orig/src/myfile.h lynx-2.8.2-dev.12+kd/src/myfile.h
--- lynx-2.8.2-dev.12.orig/src/myfile.h Wed Dec 31 16:00:00 1969
+++ lynx-2.8.2-dev.12+kd/src/myfile.h   Tue Jan  5 10:40:11 1999
@@ -0,0 +1,8 @@
+#ifndef MYFILE_H
+#define MYFILE_H
+
+extern int g_mytmp_i;
+extern char *g_mytmp[100];
+extern const int g_mytmp_i_max;
+extern const int g_maxfile_size;
+#endif /* MYFILE_H */
##----- snip -----##

reply via email to

[Prev in Thread] Current Thread [Next in Thread]