lynx-dev
[Top][All Lists]
Advanced

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

lynx-dev [dev.14] improved patch: textarea external edit (was: Re: Forms


From: Kim DeVaughn
Subject: lynx-dev [dev.14] improved patch: textarea external edit (was: Re: Forms handling)
Date: Wed, 27 Jan 1999 04:28:25 -0800

On Fri, Jan 22, 1999, Kim DeVaughn (address@hidden) said:
|
| That's coming along, but will be awhile yet, as other responsibilities do
| intrude on my available time.  Hopefully, I'll have an initial cut using
| the revised methodology within a couple weeks (but don't hold me to that
| prediction :-) ).

Heh ... it's not often, but occasionally we actually *do* beat a deadline,
albeit a self-impose one ...!

As may be ...


Attached is a "new and improved" patch that allows you to use your
editor to edit a forms TEXTAREA field, in a pretty seamless manner.

To invoke it, just bind an unused key to EDITTEXTAREA (I use the "$"
key), in your lynx.cfg file:

 KEYMAP:$:EDITTEXTAREA

and then hit ^V$ when you're in a text area.

After returning from the editor, the edited text will be in the text
area, with the number of lines expanded as required.  At that point,
it is just as if the text had been entered in the usual way, and can
be further edited, etc, from within lynx.

One exception is that if you hit a "reset button" for the form, the
number of lines will not shrink back to the original number (if indeed
new lines were added).  The text proper, however, will be cleared in
the expected way.

There are a few specific things (below) that I'd like some feedback on,
but what is needed mostly, is additional testing ... particularly on
the boundary cases (eg, the last line of a page is also the last line
of a text area, and you add some lines, etc).  I don't know HTML well
enough to easily create such test pages.  On the "live" pages that I
have tested this on, I haven't seen any problems with the algorithms
per se, though.

A few specific items:

 1. On returning from the editor, the cursor is on the same line (anchor)
    as it was on originally.  I'd like to move it to a more intuitive
    location.  The uppermost trailing blank/empty line seems to be the
    "right" place, to me.

    Note that while I trim any trailing whitespace from tail end of the
    edited text (as well as from the individual lines), I always leave
    an empty line in the TEXTAREA itself.

    Is there an easy way (function) to move the cursor to a specific
    line number within the *document* (as opposed to a line number on
    the screen)?  I didn't see anything obvious with the bit of cursory
    rooting about (grep's) that I did.


 2. If the edited text contains TAB's (maybe other chars, too ?), they
    will not render properly when the text area is displayed (may also
    have other side effects ... I haven't investigated this too closely).

    I suppose I should expand any embedded tab's (modulo 8), but do any
    other chars need "special handling", and if so, what should that be?

    If anyone has a nice little tab2spaces(), I'd really appreciate not
    having to code up yet another one.

    Note that I really don't want to get involved in any "character set
    translation" stuff.  Aside from handling tab's, and maybe other/any
    control chars, what comes out of the editor, ought to be what goes
    into the text area (I think).


 3. I'm not at all sure what a "disabled textarea" is, nor how a textarea
    becomes "disabled", much less what (if anything) I need to do about
    such an animal (ignore it, re-enable it, ???).  Comments?


 4. Included in this patch (but not really part of the textarea code),
    is a file called structdump.h.  It contains some macros for doing
    a formatted dump of various struct's to a trace file.  Others may
    find them useful ... I don't think I could have gotten this patch
    working without them.

    Is there a repository for "useful development tools" around anywhere?


Anyway, lemee know what you think ...

/kim


Against lynx2.8.2dev.14  (should be pretty easy to #ifdef, BTW):

diff -uNr lynx-2.8.2-dev.14+kd/src/GridText.c 
lynx-2.8.2-dev.14+kd.work/src/GridText.c
--- lynx-2.8.2-dev.14+kd/src/GridText.c Tue Jan 26 22:25:17 1999
+++ lynx-2.8.2-dev.14+kd.work/src/GridText.c    Tue Jan 26 22:35:14 1999
@@ -2,6 +2,7 @@
 **             ===============================
 */
 
+#include <structdump.h>
 #include <HTUtils.h>
 #include <HTString.h>
 #include <HTFont.h>
@@ -8686,4 +8687,303 @@
      *  or other directives not to use a cached rendition. - FM
      */
     return(FALSE);
+}
+
+
+/*  Transfer the initial contents of a TEXTAREA to a temp file, invoke the
+ *  user's editor on that file, then transfer the contents of the resultant
+ *  edited file back into the TEXTAREA (expanding the size of the area, if
+ *  required).   KED  01/26/99
+ */
+PUBLIC void HText_ExtEditForm ARGS1(
+            struct link *, form_link)
+{
+    struct stat stat_info;
+
+    char       *ed_temp;
+    FILE       *fp;
+
+    TextAnchor *anchor_ptr;
+    TextAnchor *start_anchor;
+    TextAnchor *end_anchor;
+    BOOLEAN     firstanchor = TRUE;
+    int         orig_cnt    = 0;
+    int         line_cnt    = 1;
+
+    FormInfo   *form     = form_link->form;
+    char       *areaname = form->name;
+    int         form_num = form->number;
+
+    HTLine     *htline;
+
+    TextAnchor *a;
+    FormInfo   *f;
+    HTLine     *l;
+
+    char       *ebuf;
+    char       *tbuf;
+    char       *line;
+    char       *cp;
+    char       *p;
+    int         len;
+    int         size;
+    int         i;
+    int         n;
+
+
+    fp = LYOpenTemp (ed_temp = (char *) malloc (LY_MAXPATH), "", "w");
+
+    /*
+     *  Begin at the beginning, to find 1st anchor in the TEXTAREA, then
+     *  write all of its lines (anchors) out to the edit temp file.
+     *
+     *  [Finding the TEXTAREA we're actually *in* with these attributes
+     *   isn't foolproof.  The form_num isn't unique to a given TEXTAREA,
+     *   and there *could* be TEXTAREA's with the same "name".  If that
+     *   should ever be true, we'll actually get the data from the *1st*
+     *   TEXTAREA in the page that matches.  We should probably assign
+     *   a unique id to each TEXTAREA in a page, and match on that, to
+     *   avoid this (potential) problem.
+     *
+     *   Since the odds of "false matches" *actually* happening in real
+     *   life seem rather small though, we'll hold off doing this, for a
+     *   rainy day ...]
+     */
+    anchor_ptr = HTMainText->first_anchor;
+
+    while (anchor_ptr) {
+
+          if ((anchor_ptr->link_type           == INPUT_ANCHOR)    &&
+             (anchor_ptr->input_field->type   == F_TEXTAREA_TYPE) &&
+             (anchor_ptr->input_field->number == form_num)        &&
+             !strcmp (anchor_ptr->input_field->name, areaname))   {
+
+            if (firstanchor) {
+               firstanchor = FALSE;
+               start_anchor = anchor_ptr;
+            }
+            orig_cnt++;
+
+            /*
+             * Write the anchor's text to the temp edit file.
+             */
+            fputs (anchor_ptr->input_field->value, fp);
+            fputc ('\n', fp);
+
+         } else {
+
+            if (!firstanchor)
+               break;
+         }
+         anchor_ptr = anchor_ptr->next;
+    }
+    fclose (fp);
+
+
+    /*
+     *  Go edit the TEXTAREA temp file.
+     */
+    snprintf (tbuf = (char *) malloc (LY_MAXPATH + 128), LY_MAXPATH + 128,
+             "%s %s", editor, ed_temp);
+
+    system (tbuf);
+
+    snprintf (tbuf, LY_MAXPATH, "%s~", ed_temp);
+    if (stat (tbuf, &stat_info) == 0)
+       unlink (tbuf);
+    free (tbuf);
+
+
+    /*
+     *  Read back the edited temp file, whacking off any trailing whitespace.
+     */
+    stat (ed_temp, &stat_info);
+    ebuf = (char *) calloc (1, (stat_info.st_size + 1) * (sizeof(char)));
+
+    fp = fopen (ed_temp, "r");
+    fread (ebuf, 1, stat_info.st_size, fp);
+    fclose (fp);
+
+    /*
+     *  Nuke any blank lines from the end of the edited data.
+     *
+     *  [maybe use isspace() here instead (portablity ?)]
+     */
+    for (size = stat_info.st_size, p = ebuf + size; size; p--, size--) {
+        if ((*p == '\n') || (*p == '\r') ||
+           (*p == '\t') || (*p == ' ')  ||
+           (*p == '\0'))
+          *p = '\0';
+       else
+          break;
+    }
+
+
+    /*
+     *  Copy each line from the temp file into the corresponding anchor
+     *  struct, removing any trailing whitespace.  Add new lines to the
+     *  TEXTAREA if needed.  (Always leave the user with a blank line at
+     *  the end of the TEXTAREA.)
+     */
+    line = (char *) malloc (MAX_LINE);
+    anchor_ptr = start_anchor;
+    len = 0;
+    p = ebuf;
+
+    while ((line_cnt <= orig_cnt) || (*p) || ((len != 0) && (*p == '\0'))) {
+
+          if (cp = strchr (p, '\n'))
+            len = cp - p;
+         else
+            len = strlen (p);
+
+         strncpy(line, "\0", MAX_LINE);
+         strncpy(line, p, len);
+
+         cp = p;
+
+         /*
+          *  Whack off trailing whitespace from the line.
+          *
+          *  [maybe use isspace() here instead, too (portable ?)]
+          */
+         for (p = line + MAX_LINE - 1, size = MAX_LINE; size; p--, size--) {
+             if ((*p == '\n') || (*p == '\r') ||
+                 (*p == '\t') || (*p == ' ')  ||
+                 (*p == '\0'))
+                *p = '\0';
+             else
+                break;
+         }
+
+
+         /*
+          *  If there are more lines in the edit buffer than were in the
+          *  original TEXTAREA, we need to add some new lines, continuing
+          *  until the edit buffer is empty.
+          *
+          *  [cloning structs should me moved to a seperate fn(), or three]
+          */
+         if (line_cnt > orig_cnt) {
+
+            /*
+             *  Find line in the text that matches ending anchorline of
+             *  the TEXTAREA.
+             */
+            for (htline = HTMainText->last_line->next, i = 0;
+                 i != end_anchor->line_num;
+                 htline = htline->next, i++);
+
+            /*
+             *  Clone and initialize the structs needed to add a new
+             *  TEXTAREA anchor.
+             */
+            a = (TextAnchor *) calloc (1, sizeof(*a));
+            f = (FormInfo   *) calloc (1, sizeof(*f));
+            l = (HTLine     *) calloc (1, LINE_SIZE(MAX_LINE));
+
+            /*  Init all the fields in the new anchor.  */
+            a->next            = end_anchor->next;
+            a->number          = end_anchor->number;
+            a->start           = end_anchor->start +
+                                  end_anchor->input_field->size + 1;
+            a->line_pos        = end_anchor->line_pos;
+            a->extent          = end_anchor->extent;
+            a->line_num        = end_anchor->line_num + 1;
+            StrAllocCopy (a->hightext, end_anchor->hightext);
+            StrAllocCopy (a->hightext2, end_anchor->hightext2);
+            a->hightext2offset = end_anchor->hightext2offset;
+            a->link_type       = end_anchor->link_type;
+            a->input_field     = f;
+            a->show_anchor     = end_anchor->show_anchor;
+            a->inUnderline     = end_anchor->inUnderline;
+            a->anchor          = end_anchor->anchor;
+
+            /*  Just the (seemingly) relevant fields in the FormInfo.  */
+            StrAllocCopy (f->name, end_anchor->input_field->name);
+            f->number     = end_anchor->input_field->number;
+            f->type       = end_anchor->input_field->type;
+            StrAllocCopy (f->orig_value, end_anchor->input_field->orig_value);
+            f->size       = end_anchor->input_field->size;
+            f->maxlength  = end_anchor->input_field->maxlength;
+            f->no_cache   = end_anchor->input_field->no_cache;
+
+            /*  Init all the fields in the new HTLine (but see the #if).  */
+            l->next        = htline->next;
+            l->prev        = htline;
+            l->offset      = htline->offset;
+            l->size        = htline->size;
+            l->split_after = htline->split_after;
+            l->bullet      = htline->bullet;
+#if defined(USE_COLOR_STYLE)
+            /* dup styles[] if needed [no need in TEXTAREA (?); leave 0's] */
+            l->numstyles   = htline->numstyles;
+#endif
+            for (i = 0; htline->data[i] != '\0';
+            l->data[i]     = htline->data[i],  i++);
+            l->data[i]     = '\0';
+
+
+            /*
+             *  Link in the new TextAnchor and make it current; link in
+             *  the new HTLine.
+             */
+            end_anchor->next = a;
+            anchor_ptr = a;
+
+            htline->next->prev = l;
+            htline->next = l;
+            htline = l;
+         }
+
+         /*
+          *  Finally copy the new line from the edit buffer into the anchor.
+          */
+         StrAllocCopy(anchor_ptr->input_field->value, line);
+
+         /*
+          *  And do the next line, for the next anchor ...
+          */
+         p = cp + len;
+         if (*p) p++;
+
+         end_anchor = anchor_ptr;
+         anchor_ptr = anchor_ptr->next;
+
+         line_cnt++;
+    }
+
+
+    /*
+     *  If new anchors were added, we need to ripple the new line numbers
+     *  (and char counts ?) thru the subsequent anchors.  Also update the
+     *  HText counts.
+     *
+     *  [dunno if the char counts really need to be done, or if we're using
+     *   the proper values ... seems OK though ...]
+     */
+    if ((n = (line_cnt - 1) - orig_cnt) > 0) {
+       i = (end_anchor->input_field->size + 1) * n;
+
+       while (anchor_ptr) {
+            anchor_ptr->line_num += n;
+            anchor_ptr->start    += i;
+            anchor_ptr            = anchor_ptr->next;
+       }
+       HTMainText->Lines += n;
+       HTMainText->chars += i;
+    }
+
+/*** MOVE the cursor to some logical place ... 1st/only blank line in
+ ***      the textarea seems most reasonable; lacking that, the end
+ ***      line of the textarea; lacking that ... the 1st line of the
+ ***      textarea; else leave it where it is (as we now do).
+ ***/
+
+    free (line);
+    free (ebuf);
+    LYRemoveTemp (ed_temp);
+    free (ed_temp);
+
+    return;
 }
diff -uNr lynx-2.8.2-dev.14+kd/src/GridText.h 
lynx-2.8.2-dev.14+kd.work/src/GridText.h
--- lynx-2.8.2-dev.14+kd/src/GridText.h Tue Jan 26 22:25:18 1999
+++ lynx-2.8.2-dev.14+kd.work/src/GridText.h    Tue Jan 26 21:23:20 1999
@@ -248,4 +248,7 @@
        HTParentAnchor *        anchor,
        CONST char *            full_address));
 
+extern void HText_ExtEditForm PARAMS((
+       struct link *   form_link));
+
 #endif /* LYGRIDTEXT_H */
diff -uNr lynx-2.8.2-dev.14+kd/src/LYKeymap.c 
lynx-2.8.2-dev.14+kd.work/src/LYKeymap.c
--- lynx-2.8.2-dev.14+kd/src/LYKeymap.c Tue Jan 26 22:25:18 1999
+++ lynx-2.8.2-dev.14+kd.work/src/LYKeymap.c    Tue Jan 26 21:46:05 1999
@@ -607,6 +607,7 @@
 { "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" },
+{ "EDITTEXTAREA",      "use defined external editor to edit the text area" },
 #ifdef USE_EXTERNALS
 { "EXTERN",            "run external program with url" },
 #endif
diff -uNr lynx-2.8.2-dev.14+kd/src/LYKeymap.h 
lynx-2.8.2-dev.14+kd.work/src/LYKeymap.h
--- lynx-2.8.2-dev.14+kd/src/LYKeymap.h Tue Jan 26 22:25:18 1999
+++ lynx-2.8.2-dev.14+kd.work/src/LYKeymap.h    Tue Jan 26 21:51:28 1999
@@ -105,15 +105,16 @@
 #define       LYK_SWITCH_DTD    72
 #define       LYK_ELGOTO        73
 #define       LYK_CHANGE_LINK   74
+#define              LYK_EDIT_TEXTAREA 75
 
 #ifdef USE_EXTERNALS
-#define       LYK_EXTERN        75
+#define       LYK_EXTERN        76
 #if defined(VMS) || defined(DIRED_SUPPORT)
-#define       LYK_DIRED_MENU    76
+#define       LYK_DIRED_MENU    77
 #endif /* VMS || DIRED_SUPPORT */
 #else  /* USE_EXTERNALS */
 #if defined(VMS) || defined(DIRED_SUPPORT)
-#define       LYK_DIRED_MENU    75
+#define       LYK_DIRED_MENU    76
 #endif /* VMS || DIRED_SUPPORT */
 #endif /* !defined(USE_EXTERNALS) */
 
diff -uNr lynx-2.8.2-dev.14+kd/src/LYMainLoop.c 
lynx-2.8.2-dev.14+kd.work/src/LYMainLoop.c
--- lynx-2.8.2-dev.14+kd/src/LYMainLoop.c       Tue Jan 26 22:25:20 1999
+++ lynx-2.8.2-dev.14+kd.work/src/LYMainLoop.c  Tue Jan 26 22:48:24 1999
@@ -1719,6 +1719,8 @@
           *  back through the getch() loop.
           */
 
+       CTRACE_FLUSH(tfp);
+
        switch(cmd) {
        case 0: /* unmapped character */
        default:
@@ -4290,6 +4292,38 @@
                 */
                cmd = LYK_PREV_DOC;
                goto new_cmd;
+           }
+           break;
+
+       case LYK_EDIT_TEXTAREA: /* use external editor on a TEXTAREA - KED */
+           if (no_editor) {
+              if (old_c != real_c) {
+                 old_c = real_c;
+                 HTUserMsg(EDIT_DISABLED);
+              }
+              break;
+           }
+
+              /* is curent link part of a textarea */
+           if (links[curdoc.link].type == WWW_FORM_LINK_TYPE &&
+               links[curdoc.link].form->type == F_TEXTAREA_TYPE) {
+
+              /* stop screen */
+              stop_curses();
+
+              HText_ExtEditForm (&links[curdoc.link]);
+
+              /* start screen */
+              start_curses();
+              refresh_screen = TRUE;
+
+              /*
+              cmd = LYK_REFRESH;
+              goto new_cmd;
+              */
+
+           } else {
+              HTInfoMsg ("Not in a TEXTAREA; cannot use external editor.");
            }
            break;
 
diff -uNr lynx-2.8.2-dev.14+kd/src/structdump.h 
lynx-2.8.2-dev.14+kd.work/src/structdump.h
--- lynx-2.8.2-dev.14+kd/src/structdump.h       Wed Dec 31 16:00:00 1969
+++ lynx-2.8.2-dev.14+kd.work/src/structdump.h  Wed Jan 27 03:43:30 1999
@@ -0,0 +1,137 @@
+/*
+ *
+ * Some macros to dump out formatted struct's via the trace file.  -KED
+ *
+ */
+#ifndef STRUCTDUMP_H
+#define STRUCTDUMP_H
+
+/* usage: DUMPSTRUCT_LINK(link_ptr, "message"); */
+#define   DUMPSTRUCT_LINK(L,X) \
+CTRACE(tfp, "\n" \
+            "KED:     link_ptr=%08x  sizeof=%d  ["X"]\n" \
+            "link       struct {\n" \
+            "           *lname=%08x\n" \
+            "            lname=|%s|\n" \
+            "          *target=%08x\n" \
+            "           target=|%s|\n" \
+            "        *hightext=%08x\n" \
+            "         hightext=|%s|\n" \
+            "       *hightext2=%08x\n" \
+            "        hightext2=|%s|\n" \
+            " hightext2_offset=%d\n" \
+            "      inUnderline=%1x\n" \
+            "               lx=%d\n" \
+            "               ly=%d\n" \
+            "             type=%d\n" \
+            "    anchor_number=%d\n" \
+            "  anchor_line_num=%d\n" \
+            "            *form=%08x\n" \
+            "}\n", \
+            (L), sizeof(*((L))), \
+            (L)->lname, (L)->lname, (L)->target, (L)->target, \
+            (L)->hightext, (L)->hightext, (L)->hightext2, (L)->hightext2, \
+            (L)->hightext2_offset, (L)->inUnderline, (L)->lx, (L)->ly, \
+            (L)->type, (L)->anchor_number, (L)->anchor_line_num, (L)->form); \
+CTRACE_FLUSH(tfp);
+
+
+/* usage: DUMPSTRUCT_ANCHOR(anchor_ptr, "message"); */
+#define   DUMPSTRUCT_ANCHOR(A,X) \
+CTRACE(tfp, "\n" \
+            "KED:   anchor_ptr=%08x  sizeof=%d  ["X"]\n" \
+            "TextAnchor struct {\n" \
+            "            *next=%08x\n" \
+            "           number=%d\n" \
+            "            start=%d\n" \
+            "         line_pos=%d\n" \
+            "           extent=%d\n" \
+            "         line_num=%d\n" \
+            "        *hightext=%08x\n" \
+            "         hightext=|%s|\n" \
+            "       *hightext2=%08x\n" \
+            "        hightext2=|%s|\n" \
+            "  hightext2offset=%d\n" \
+            "        link_type=%d\n" \
+            "     *input_field=%08x\n" \
+            "      input_field=|%s|\n" \
+            "      show_anchor=%1x\n" \
+            "      inUnderline=%1x\n" \
+            "          *anchor=%08x\n" \
+            "}\n", \
+            (A), sizeof(*((A))), \
+            (A)->next, (A)->number, (A)->start, (A)->line_pos, \
+            (A)->extent, (A)->line_num, \
+            (A)->hightext, (A)->hightext, (A)->hightext2, (A)->hightext2, \
+            (A)->hightext2offset, (A)->link_type, \
+            (A)->input_field, (A)->input_field, \
+            (A)->show_anchor, (A)->inUnderline, (A)->anchor); \
+CTRACE_FLUSH(tfp);
+
+
+/* usage: DUMPSTRUCT_FORM(forminfo_ptr, "message"); */
+#define   DUMPSTRUCT_FORMINFO(F,X) \
+CTRACE(tfp, "\n" \
+            "KED: forminfo_ptr=%08x  sizeof=%d  ["X"]\n" \
+            "FormInfo   struct {\n" \
+            "            *name=%08x\n" \
+            "             name=|%s|\n" \
+            "           number=%d\n" \
+            "             type=%d\n" \
+            "           *value=%08x\n" \
+            "            value=|%s|\n" \
+            "      *orig_value=%08x\n" \
+            "       orig_value=|%s|\n" \
+            "             size=%d\n" \
+            "        maxlength=%d\n" \
+            "            group=%d\n" \
+            "        num_value=%d\n" \
+            "           hrange=%d\n" \
+            "           lrange=%d\n" \
+            "     *select_list=%08x\n" \
+            "    submit_action=|%s|\n" \
+            "    submit_method=%d\n" \
+            "   submit_enctype=|%s|\n" \
+            "     submit_title=|%s|\n" \
+            "         no_cache=%1x\n" \
+            "  cp_submit_value=|%s|\n" \
+            "orig_submit_value=|%s|\n" \
+            "           size_l=%d\n" \
+            "         disabled=%d\n" \
+            "          name_cs=%d\n" \
+            "         value_cs=%d\n" \
+            "        accept_cs=|%s|\n" \
+            "}\n", \
+            (F), sizeof(*((F))), \
+            (F)->name, (F)->name, (F)->number, (F)->type, \
+            (F)->value, (F)->value, (F)->orig_value, (F)->orig_value, \
+            (F)->size, (F)->maxlength, (F)->group, (F)->num_value, \
+            (F)->hrange, (F)->lrange, (F)->select_list, (F)->submit_action, \
+            (F)->submit_method, (F)->submit_enctype, (F)->submit_title, \
+            (F)->no_cache, (F)->cp_submit_value, (F)->orig_submit_value, \
+            (F)->size_l, (F)->disabled, (F)->name_cs, (F)->value_cs,
+            (F)->accept_cs); \
+CTRACE_FLUSH(tfp);
+
+
+/* usage: DUMPSTRUCT_LINE(htline_ptr, "message"); */
+#define   DUMPSTRUCT_LINE(L,X) \
+CTRACE(tfp, "\n" \
+            "KED: htline_ptr=%08x  sizeof=%d  ["X"]\n" \
+            "HTLine struct {\n" \
+            "        *next=%08x\n" \
+            "        *prev=%08x\n" \
+            "       offset=%d\n" \
+            "         size=%d\n" \
+            "  split_after=%1x\n" \
+            "       bullet=%1x\n" \
+            "nodef U_C_S\n" \
+            "       data[]=%08x\n" \
+            "         data=|%s|\n" \
+            "}\n", \
+            (L), sizeof(*((L))), \
+            (L)->next, (L)->prev, (L)->offset, (L)->size, (L)->split_after, \
+            (L)->bullet, (L)->data, (L)->data); \
+CTRACE_FLUSH(tfp);
+
+#endif /* STRUCTDUMP_H */
##--eof--##

reply via email to

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