zend_string.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package zend
  2. /*
  3. #include <zend_API.h>
  4. #include <zend_string.h>
  5. #ifdef ZEND_ENGINE_3
  6. zend_string *zend_string_new_ownered(char *str, size_t len, int persistent) {
  7. zend_string *ret = zend_string_alloc(len, persistent);
  8. // memcpy(ZSTR_VAL(ret), str, len);
  9. memcpy(&ZSTR_VAL(ret), &str, sizeof(&str));
  10. ZSTR_VAL(ret)[len] = '\0';
  11. return ret;
  12. }
  13. char *zend_string_to_char(void *zs) { return &((zend_string*)zs)->val[0];}
  14. #else
  15. char *zend_string_to_char(void *zs) { return (char*)zs;}
  16. #endif
  17. */
  18. import "C"
  19. import "unsafe"
  20. import "reflect"
  21. import "log"
  22. // type ZString *C.zend_string
  23. /*
  24. func fromZString(s *C.zend_string) string {
  25. r := C.GoStringN(&s.val[0], C.int(s.len))
  26. return r
  27. }
  28. */
  29. func fromZString(s interface{}) string {
  30. if s == nil {
  31. return ""
  32. }
  33. sv := reflect.ValueOf(s)
  34. // log.Println(s, sv.Type().String(), sv.Type().Kind(), sv.Pointer())
  35. if sv.Type().Kind() != reflect.Ptr {
  36. log.Println("not supported type:", sv.Type().Kind())
  37. return ""
  38. }
  39. if sv.IsNil() {
  40. return ""
  41. }
  42. switch sv.Type().String() {
  43. case "*zend._Ctype_struct__zend_string":
  44. s_c := C.zend_string_to_char(unsafe.Pointer(sv.Pointer()))
  45. s_go := C.GoString(s_c)
  46. return s_go
  47. case "*zend._Ctype_char":
  48. s_go := C.GoString(s.(*C.char))
  49. return s_go
  50. }
  51. return ""
  52. }
  53. /*
  54. func toZString(s string) *C.zend_string {
  55. persistent := 0
  56. s_ := C.CString(s)
  57. // defer C.free(s_)
  58. // r := C.zend_string_init(s_, C.size_t(len(s)), C.int(persistent))
  59. r := C.zend_string_new_ownered(s_, C.size_t(len(s)), C.int(persistent))
  60. return r
  61. }
  62. */