diff --git a/0.go b/0.go index f685c5a..21f7756 100644 --- a/0.go +++ b/0.go @@ -29,7 +29,7 @@ func getPascalStringFromBytes(goBytes []byte) C.PascalString { // getCPascalStringArrayFromStringSlice converts a Go slice // of strings to a C array of pascal strings. -func getCPascalStringArrayFromStringSlice(goSlice []string) *C.PascalString { +func getCPascalStringArrayFromStringSlice(goSlice []string) C.PascalStringArray { // allocate C array for PascalStrings cArrPtr := (*C.PascalString)(C.malloc(C.size_t(len(goSlice)) * C.size_t(C.sizeof_PascalString))) @@ -39,7 +39,7 @@ func getCPascalStringArrayFromStringSlice(goSlice []string) *C.PascalString { cArr[i] = getPascalString(goSlice[i]) } - return cArrPtr + return C.PascalStringArray{data: cArrPtr, len: C.int(len(goSlice))} } // GetPascalStringFromCString is a helper meant to be used from C. @@ -55,12 +55,12 @@ func GetPascalStringFromCString(cString *C.char) C.PascalString { // FreeArray frees the memory allocated by a C-allocated array. // //export FreeArray -func FreeArray(items *C.PascalString, count C.int) { - linesSlice := (*[1 << 30]C.PascalString)(unsafe.Pointer(items))[:count:count] - for i := 0; i < int(count); i++ { +func FreeArray(array C.PascalStringArray) { + linesSlice := (*[1 << 30]C.PascalString)(unsafe.Pointer(array.data))[:array.len:array.len] + for i := 0; i < int(array.len); i++ { C.free(unsafe.Pointer(linesSlice[i].data)) } - C.free(unsafe.Pointer(items)) + C.free(unsafe.Pointer(array.data)) } // safeStringDeref safely dereferences a string pointer, returning empty string if nil. diff --git a/README.md b/README.md index d6ac1b1..0d1b322 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,13 @@ int main() { exit(1); // result.r0 not freed since program exits } - for (int i = 0; i < result.r2; i++) { + for (int i = 0; i < result.r1.len; i++) { // print Pascal string using "%.*s" with printf and supplying both length and data - printf("%.*s\n", result.r1[i].len, result.r1[i].data); + printf("%.*s\n", result.r1.data[i].len, result.r1.data[i].data); } // be sure to free the data! - FreeArray(result.r1, result.r2); + FreeArray(result.r1); } ``` diff --git a/crypt.go b/crypt.go index 0678312..6e1b826 100644 --- a/crypt.go +++ b/crypt.go @@ -11,22 +11,20 @@ import ( // DecryptFileToSlice returns: // r0: err // -// r1: decLines (pointer to C-allocated array) -// -// r2: decLines length +// r1: decLines // //export DecryptFileToSlice -func DecryptFileToSlice(realPath, rcwPassword C.PascalString) (*C.char, *C.PascalString, C.int) { +func DecryptFileToSlice(realPath, rcwPassword C.PascalString) (*C.char, C.PascalStringArray) { lines, err := crypt.DecryptFileToSlice(C.GoStringN(realPath.data, realPath.len), []byte(C.GoStringN(rcwPassword.data, rcwPassword.len))) if err != nil { - return C.CString(err.Error()), nil, 0 + return C.CString(err.Error()), C.PascalStringArray{} } if len(lines) == 0 { - return nil, nil, 0 + return nil, C.PascalStringArray{} } - return nil, getCPascalStringArrayFromStringSlice(lines), C.int(len(lines)) + return nil, getCPascalStringArrayFromStringSlice(lines) } // EncryptBytes returns: diff --git a/syncclient.go b/syncclient.go index 9667358..df2e26d 100644 --- a/syncclient.go +++ b/syncclient.go @@ -68,23 +68,17 @@ func GenDeviceID(oldDeviceID, prefix C.PascalString) (*C.char, C.PascalString, C // RunJob returns: // r0: err // -// r1: deleteList (pointer to C-allocated array) +// r1: deleteList // -// r2: deleteList length +// r2: downloadList // -// r3: downloadList (pointer to C-allocated array) -// -// r4: downloadList length -// -// r5: uploadList (pointer to C-allocated array) -// -// r6: uploadList length +// r3: uploadList // //export RunJob -func RunJob() (*C.char, *C.PascalString, C.int, *C.PascalString, C.int, *C.PascalString, C.int) { +func RunJob() (*C.char, C.PascalStringArray, C.PascalStringArray, C.PascalStringArray) { lists, err := syncclient.RunJob() if err != nil { - return C.CString(err.Error()), nil, 0, nil, 0, nil, 0 + return C.CString(err.Error()), C.PascalStringArray{}, C.PascalStringArray{}, C.PascalStringArray{} } - return nil, getCPascalStringArrayFromStringSlice(lists.Delete), C.int(len(lists.Delete)), getCPascalStringArrayFromStringSlice(lists.Download), C.int(len(lists.Download)), getCPascalStringArrayFromStringSlice(lists.Upload), C.int(len(lists.Upload)) + return nil, getCPascalStringArrayFromStringSlice(lists.Delete), getCPascalStringArrayFromStringSlice(lists.Download), getCPascalStringArrayFromStringSlice(lists.Upload) } diff --git a/synccommon.go b/synccommon.go index 99da1f1..979fcbc 100644 --- a/synccommon.go +++ b/synccommon.go @@ -13,39 +13,33 @@ import ( // WalkEntryDir returns: // r0: err // -// r1: files (pointer to C-allocated array) +// r1: files // -// r2: files length -// -// r3: dirs (pointer to C-allocated array) -// -// r4: dirs length +// r2: dirs // //export WalkEntryDir -func WalkEntryDir() (*C.char, *C.PascalString, C.int, *C.PascalString, C.int) { +func WalkEntryDir() (*C.char, C.PascalStringArray, C.PascalStringArray) { files, dirs, err := synccommon.WalkEntryDir() if err != nil { - return C.CString(err.Error()), nil, 0, nil, 0 + return C.CString(err.Error()), C.PascalStringArray{}, C.PascalStringArray{} } - return nil, getCPascalStringArrayFromStringSlice(files), C.int(len(files)), getCPascalStringArrayFromStringSlice(dirs), C.int(len(dirs)) + return nil, getCPascalStringArrayFromStringSlice(files), getCPascalStringArrayFromStringSlice(dirs) } // GetAllEntryData returns: // r0: err // -// r1: vanityPaths (pointer to C-allocated array) +// r1: vanityPaths // -// r2: vanityPaths length +// r2: translatedAges (pointer to C-allocated array) // -// r3: translatedAges (pointer to C-allocated array) -// -// r4: translatedAges length +// r3: translatedAges length // //export GetAllEntryData -func GetAllEntryData() (*C.char, *C.PascalString, C.int, *uint8, C.int) { +func GetAllEntryData() (*C.char, C.PascalStringArray, *uint8, C.int) { entryMap, err := synccommon.GetAllEntryData() if err != nil { - return C.CString(err.Error()), nil, 0, nil, 0 + return C.CString(err.Error()), C.PascalStringArray{}, nil, 0 } var vanityPaths []string var translatedAges []uint8 @@ -53,5 +47,5 @@ func GetAllEntryData() (*C.char, *C.PascalString, C.int, *uint8, C.int) { vanityPaths = append(vanityPaths, k) translatedAges = append(translatedAges, age.TranslateAgeTimestamp(v.AgeTimestamp)) } - return nil, getCPascalStringArrayFromStringSlice(vanityPaths), C.int(len(vanityPaths)), (*uint8)(unsafe.Pointer(&translatedAges[0])), C.int(len(translatedAges)) + return nil, getCPascalStringArrayFromStringSlice(vanityPaths), (*uint8)(unsafe.Pointer(&translatedAges[0])), C.int(len(translatedAges)) } diff --git a/types.h b/types.h index c5619c2..7d78650 100644 --- a/types.h +++ b/types.h @@ -6,4 +6,9 @@ typedef struct { int len; } PascalString; +typedef struct { + PascalString* data; + int len; +} PascalStringArray; + #endif