Commit 95fa16a8 authored by Eric Clark's avatar Eric Clark Committed by Russ Cox

cgo: add C.GoStringN

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
parent 6e762987
...@@ -154,7 +154,7 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name, soprefix, sopath str ...@@ -154,7 +154,7 @@ func (p *Package) writeDefsFunc(fc, fgo2 *os.File, n *Name, soprefix, sopath str
printer.Fprint(fgo2, d) printer.Fprint(fgo2, d)
fmt.Fprintf(fgo2, "\n") 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. // The builtins are already defined in the C prolog.
return return
} }
...@@ -230,7 +230,7 @@ func (p *Package) writeOutput(f *File, srcfile string) { ...@@ -230,7 +230,7 @@ func (p *Package) writeOutput(f *File, srcfile string) {
func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) { func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) {
name := n.Mangle 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 // The builtins are already defined in the C prolog, and we don't
// want to duplicate function definitions we've already done. // want to duplicate function definitions we've already done.
return return
...@@ -580,6 +580,7 @@ __cgo_size_assert(double, 8) ...@@ -580,6 +580,7 @@ __cgo_size_assert(double, 8)
const builtinProlog = ` const builtinProlog = `
typedef struct { char *p; int n; } _GoString_; typedef struct { char *p; int n; } _GoString_;
_GoString_ GoString(char *p); _GoString_ GoString(char *p);
_GoString_ GoStringN(char *p, int l);
char *CString(_GoString_); char *CString(_GoString_);
` `
...@@ -602,6 +603,13 @@ void ...@@ -602,6 +603,13 @@ void
FLUSH(&s); FLUSH(&s);
} }
void
·_Cfunc_GoStringN(int8 *p, int32 l, String s)
{
s = gostringn((byte*)p, l);
FLUSH(&s);
}
void void
·_Cfunc_CString(String s, int8 *p) ·_Cfunc_CString(String s, int8 *p)
{ {
......
...@@ -387,6 +387,7 @@ void* mal(uintptr); ...@@ -387,6 +387,7 @@ void* mal(uintptr);
uint32 cmpstring(String, String); uint32 cmpstring(String, String);
String catstring(String, String); String catstring(String, String);
String gostring(byte*); String gostring(byte*);
String gostringn(byte*, int32);
String gostringnocopy(byte*); String gostringnocopy(byte*);
String gostringw(uint16*); String gostringw(uint16*);
void initsig(int32); void initsig(int32);
......
...@@ -60,6 +60,16 @@ gostring(byte *str) ...@@ -60,6 +60,16 @@ gostring(byte *str)
return s; return s;
} }
String
gostringn(byte *str, int32 l)
{
String s;
s = gostringsize(l);
mcpy(s.str, str, l);
return s;
}
String String
gostringnocopy(byte *str) gostringnocopy(byte *str)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment