Lindenii Project Forge
Login

go-lindenii-common

Common library for the Lindenii Project
Commit info
ID
e2502a2e835e9b6f230a5fc2fc7d198f9892cd6c
Author
Runxi Yu <me@runxiyu.org>
Author date
Sun, 05 Jan 2025 16:40:10 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Sun, 05 Jan 2025 16:40:10 +0800
Actions
misc: Pointerize_first
// Package misc provides miscellaneous functions.
package misc

import (
	"errors"
	"strings"
)

// Pointerize_first returns the address of its first argument, and the value of
// its second argument. This is useful to for taking the address of a function
// that also has an error return value.
func Pointerize_first[T1 any, T2 any](x1 T1, x2 T2) (*T1, T2) {
	return &x1, x2
}

// Copy_map the map src to dst without clearing existing items in dst.
func Copy_map[K comparable, V any](dst map[K]V, src map[K]V) {
	for k, v := range src {
		dst[k] = v
	}
}

// String_to_byte_ptr returns a pointer to the first byte of a string. It
// ensures that the returned pointer is null-terminated.
func String_to_byte_ptr(s string) (*byte, error) {
	// If the string already contains a null then whoever attempts to
	// interpret this as a null-terminated string won't be able to see the
	// whole string. This is probably not expected by the caller.
	if strings.IndexByte(s, 0) != -1 {
		return nil, Err_null_byte
	}
	buf := make([]byte, len(s)+1) // Zeros them out...
	copy(buf, s)                  // ... so the last byte would be null.
	return &buf[0], nil
}

var Err_null_byte = errors.New("string contains null byte")