mirror of
https://github.com/rwinkhart/cmutton.git
synced 2026-08-27 20:36:31 -04:00
Add new PascalStringArray type
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user