Add new PascalStringArray type

This commit is contained in:
2026-02-01 00:18:49 -05:00
parent b956f71b17
commit cefdb30193
6 changed files with 36 additions and 45 deletions
+6 -6
View File
@@ -29,7 +29,7 @@ func getPascalStringFromBytes(goBytes []byte) C.PascalString {
// getCPascalStringArrayFromStringSlice converts a Go slice // getCPascalStringArrayFromStringSlice converts a Go slice
// of strings to a C array of pascal strings. // 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 // allocate C array for PascalStrings
cArrPtr := (*C.PascalString)(C.malloc(C.size_t(len(goSlice)) * C.size_t(C.sizeof_PascalString))) 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]) 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. // 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. // FreeArray frees the memory allocated by a C-allocated array.
// //
//export FreeArray //export FreeArray
func FreeArray(items *C.PascalString, count C.int) { func FreeArray(array C.PascalStringArray) {
linesSlice := (*[1 << 30]C.PascalString)(unsafe.Pointer(items))[:count:count] linesSlice := (*[1 << 30]C.PascalString)(unsafe.Pointer(array.data))[:array.len:array.len]
for i := 0; i < int(count); i++ { for i := 0; i < int(array.len); i++ {
C.free(unsafe.Pointer(linesSlice[i].data)) 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. // safeStringDeref safely dereferences a string pointer, returning empty string if nil.
+3 -3
View File
@@ -53,13 +53,13 @@ int main() {
exit(1); // result.r0 not freed since program exits 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 // 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! // be sure to free the data!
FreeArray(result.r1, result.r2); FreeArray(result.r1);
} }
``` ```
+5 -7
View File
@@ -11,22 +11,20 @@ import (
// DecryptFileToSlice returns: // DecryptFileToSlice returns:
// r0: err // r0: err
// //
// r1: decLines (pointer to C-allocated array) // r1: decLines
//
// r2: decLines length
// //
//export DecryptFileToSlice //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))) lines, err := crypt.DecryptFileToSlice(C.GoStringN(realPath.data, realPath.len), []byte(C.GoStringN(rcwPassword.data, rcwPassword.len)))
if err != nil { if err != nil {
return C.CString(err.Error()), nil, 0 return C.CString(err.Error()), C.PascalStringArray{}
} }
if len(lines) == 0 { 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: // EncryptBytes returns:
+6 -12
View File
@@ -68,23 +68,17 @@ func GenDeviceID(oldDeviceID, prefix C.PascalString) (*C.char, C.PascalString, C
// RunJob returns: // RunJob returns:
// r0: err // r0: err
// //
// r1: deleteList (pointer to C-allocated array) // r1: deleteList
// //
// r2: deleteList length // r2: downloadList
// //
// r3: downloadList (pointer to C-allocated array) // r3: uploadList
//
// r4: downloadList length
//
// r5: uploadList (pointer to C-allocated array)
//
// r6: uploadList length
// //
//export RunJob //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() lists, err := syncclient.RunJob()
if err != nil { 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)
} }
+11 -17
View File
@@ -13,39 +13,33 @@ import (
// WalkEntryDir returns: // WalkEntryDir returns:
// r0: err // r0: err
// //
// r1: files (pointer to C-allocated array) // r1: files
// //
// r2: files length // r2: dirs
//
// r3: dirs (pointer to C-allocated array)
//
// r4: dirs length
// //
//export WalkEntryDir //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() files, dirs, err := synccommon.WalkEntryDir()
if err != nil { 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: // GetAllEntryData returns:
// r0: err // 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) // r3: translatedAges length
//
// r4: translatedAges length
// //
//export GetAllEntryData //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() entryMap, err := synccommon.GetAllEntryData()
if err != nil { 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 vanityPaths []string
var translatedAges []uint8 var translatedAges []uint8
@@ -53,5 +47,5 @@ func GetAllEntryData() (*C.char, *C.PascalString, C.int, *uint8, C.int) {
vanityPaths = append(vanityPaths, k) vanityPaths = append(vanityPaths, k)
translatedAges = append(translatedAges, age.TranslateAgeTimestamp(v.AgeTimestamp)) 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))
} }
+5
View File
@@ -6,4 +6,9 @@ typedef struct {
int len; int len;
} PascalString; } PascalString;
typedef struct {
PascalString* data;
int len;
} PascalStringArray;
#endif #endif