]> git.neil.brown.name Git - edlib.git/commitdiff
Use callback to return string from doc:get-str
authorNeilBrown <neil@brown.name>
Tue, 8 Dec 2015 03:52:27 +0000 (14:52 +1100)
committerNeilBrown <neil@brown.name>
Thu, 10 Dec 2015 02:54:09 +0000 (13:54 +1100)
This way it is clear how ownership of the string is managed.

Signed-off-by: NeilBrown <neil@brown.name>
core-doc.c
core.h
doc-text.c

index 9f7a6598f3812ecde30a6aff5acd83e72115c5e5..a967ed122117897a9350f7586381efc97663dc2b 100644 (file)
@@ -628,7 +628,7 @@ struct pane *doc_find(struct editor *ed, char *name)
 
 DEF_CMD(doc_attr_callback)
 {
-       struct call_return *cr = container_of(ci->comm, struct call_return , c);
+       struct call_return *cr = container_of(ci->comm, struct call_return, c);
        cr->s = ci->str;
        return 1;
 }
@@ -652,6 +652,31 @@ char *doc_attr(struct pane *dp, struct mark *m, bool forward, char *attr)
        return cr.s;
 }
 
+DEF_CMD(doc_str_callback)
+{
+       struct call_return *cr = container_of(ci->comm, struct call_return, c);
+       cr->s = strdup(ci->str);
+       return 1;
+}
+
+char *doc_getstr(struct pane *from, struct mark *to)
+{
+       struct cmd_info ci = {0};
+       int ret;
+       struct call_return cr;
+
+       ci.key = "doc:get-str";
+       ci.focus = from;
+       ci.mark = to;
+       cr.c = doc_str_callback;
+       cr.s = NULL;
+       ci.comm2 = &cr.c;
+       ret = key_handle_focus(&ci);
+       if (!ret)
+               return NULL;
+       return cr.s;
+}
+
 /* the 'docs' document type is special in that there can only ever
  * be one instance - the list of documents.
  * So there is no 'doctype' registered, just a document which can never
diff --git a/core.h b/core.h
index 30c34cf8fb90e793ac9f2326cddf338fb5fb7ec2..aded137d1ae366d0715759db5ee4b0735bbf085c 100644 (file)
--- a/core.h
+++ b/core.h
@@ -169,6 +169,7 @@ void point_notify_change(struct doc *d, struct mark *p, struct mark *m);
 void doc_notify_change(struct doc *d, struct mark *m);
 void doc_check_consistent(struct doc *d);
 char *doc_attr(struct pane *dp, struct mark *m, bool forward, char *attr);
+char *doc_getstr(struct pane *from, struct mark *to);
 void point_to_mark(struct mark *p, struct mark *m);
 void mark_to_mark(struct mark *m, struct mark *target);
 int mark_same(struct doc *d, struct mark *m1, struct mark *m2);
@@ -386,19 +387,6 @@ static inline int doc_load_file(struct pane *p, int fd, char *name)
        ci.key = "doc:load-file";
        return key_handle_focus(&ci);
 }
-static inline char *doc_getstr(struct pane *from, struct mark *to)
-{
-       struct cmd_info ci = {0};
-       int ret;
-
-       ci.key = "doc:get-str";
-       ci.focus = from;
-       ci.mark = to;
-       ret = key_handle_focus(&ci);
-       if (!ret)
-               return NULL;
-       return ci.str;
-}
 
 static inline int doc_set_attr(struct pane *p, struct mark *pt,
                               char *attr, char *val)
index 5cb55bf185d8d51e825355216a8668a3051543d5..10165ba2e89a0e84ef5b409053e287b2026ae6dd 100644 (file)
@@ -1155,7 +1155,8 @@ DEF_CMD(text_get_str)
                        break;
        }
        ret[l] = 0;
-       ci->str = ret;
+       comm_call(ci->comm2, "callback:get-str", ci->focus, 0, NULL, ret, 0);
+       free(ret);
        return 1;
 }