]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: add C.GoStringN
authorEric Clark <zerohp@gmail.com>
Thu, 19 Aug 2010 02:29:05 +0000 (22:29 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 19 Aug 2010 02:29:05 +0000 (22:29 -0400)
Function to create a GoString with a known length so it can contain NUL
bytes anywhere in the string. Some C libraries have strings like this.

R=rsc
CC=golang-dev
https://golang.org/cl/2007042

src/cmd/cgo/out.go
src/pkg/runtime/runtime.h
src/pkg/runtime/string.goc

index adf7abef446bb00b91d74f0e6d2468da8b3b2340..906b2c511f7d3180b450878a3bb00fe547cd9045 100644 (file)
@@ -154,7 +154,7 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name, soprefix, sopath str
        printer.Fprint(fgo2, d)
        fmt.Fprintf(fgo2, "\n")
 
-       if name == "CString" || name == "GoString" {
+       if name == "CString" || name == "GoString" || name == "GoStringN" {
                // The builtins are already defined in the C prolog.
                return
        }
@@ -230,7 +230,7 @@ func (p *Package) writeOutput(f *File, srcfile string) {
 
 func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) {
        name := n.Mangle
-       if name == "_Cfunc_CString" || name == "_Cfunc_GoString" || p.Written[name] {
+       if name == "_Cfunc_CString" || name == "_Cfunc_GoString" || name == "_Cfunc_GoStringN" || p.Written[name] {
                // The builtins are already defined in the C prolog, and we don't
                // want to duplicate function definitions we've already done.
                return
@@ -580,6 +580,7 @@ __cgo_size_assert(double, 8)
 const builtinProlog = `
 typedef struct { char *p; int n; } _GoString_;
 _GoString_ GoString(char *p);
+_GoString_ GoStringN(char *p, int l);
 char *CString(_GoString_);
 `
 
@@ -602,6 +603,13 @@ void
        FLUSH(&s);
 }
 
+void
+·_Cfunc_GoStringN(int8 *p, int32 l, String s)
+{
+       s = gostringn((byte*)p, l);
+       FLUSH(&s);
+}
+
 void
 ·_Cfunc_CString(String s, int8 *p)
 {
index a774d96d50b1556bdf842151cba05b4c4316c258..0e4adafb35553152738b1762b1ddead3ad5ed913 100644 (file)
@@ -387,6 +387,7 @@ void*       mal(uintptr);
 uint32 cmpstring(String, String);
 String catstring(String, String);
 String gostring(byte*);
+String  gostringn(byte*, int32);
 String gostringnocopy(byte*);
 String gostringw(uint16*);
 void   initsig(int32);
index 1a4847322167c62fe1aa9aa5500ddcf7a52f400e..ec45735164f4e5a5e649e427e586ea10f12c404c 100644 (file)
@@ -60,6 +60,16 @@ gostring(byte *str)
        return s;
 }
 
+String
+gostringn(byte *str, int32 l)
+{
+    String s;
+
+    s = gostringsize(l);
+    mcpy(s.str, str, l);
+    return s;
+}
+
 String
 gostringnocopy(byte *str)
 {