/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2015. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #ifndef NTCORE_C_H_ #define NTCORE_C_H_ #include #ifdef __cplusplus extern "C" { #endif /** Default network tables port number */ #define NT_DEFAULT_PORT 1735 /** NetworkTables data types. */ enum NT_Type { NT_UNASSIGNED = 0, NT_BOOLEAN = 0x01, NT_DOUBLE = 0x02, NT_STRING = 0x04, NT_RAW = 0x08, NT_BOOLEAN_ARRAY = 0x10, NT_DOUBLE_ARRAY = 0x20, NT_STRING_ARRAY = 0x40, NT_RPC = 0x80 }; /** NetworkTables entry flags. */ enum NT_EntryFlags { NT_PERSISTENT = 0x01 }; /** NetworkTables logging levels. */ enum NT_LogLevel { NT_LOG_CRITICAL = 50, NT_LOG_ERROR = 40, NT_LOG_WARNING = 30, NT_LOG_INFO = 20, NT_LOG_DEBUG = 10, NT_LOG_DEBUG1 = 9, NT_LOG_DEBUG2 = 8, NT_LOG_DEBUG3 = 7, NT_LOG_DEBUG4 = 6 }; /** NetworkTables notififier kinds. */ enum NT_NotifyKind { NT_NOTIFY_NONE = 0, NT_NOTIFY_IMMEDIATE = 0x01, /* initial listener addition */ NT_NOTIFY_LOCAL = 0x02, /* changed locally */ NT_NOTIFY_NEW = 0x04, /* newly created entry */ NT_NOTIFY_DELETE = 0x08, /* deleted */ NT_NOTIFY_UPDATE = 0x10, /* value changed */ NT_NOTIFY_FLAGS = 0x20 /* flags changed */ }; /* * Structures */ /** A NetworkTables string. */ struct NT_String { /** String contents (UTF-8). * The string is NOT required to be zero-terminated. * When returned by the library, this is zero-terminated and allocated with * malloc(). */ char *str; /** Length of the string in bytes. If the string happens to be zero * terminated, this does not include the zero-termination. */ size_t len; }; /** NetworkTables Entry Value. Note this is a typed union. */ struct NT_Value { enum NT_Type type; unsigned long long last_change; union { int v_boolean; double v_double; struct NT_String v_string; struct NT_String v_raw; struct { int *arr; size_t size; } arr_boolean; struct { double *arr; size_t size; } arr_double; struct { struct NT_String *arr; size_t size; } arr_string; } data; }; /** NetworkTables Entry Information */ struct NT_EntryInfo { /** Entry name */ struct NT_String name; /** Entry type */ enum NT_Type type; /** Entry flags */ unsigned int flags; /** Timestamp of last change to entry (type or value). */ unsigned long long last_change; }; /** NetworkTables Connection Information */ struct NT_ConnectionInfo { struct NT_String remote_id; char *remote_name; unsigned int remote_port; unsigned long long last_update; unsigned int protocol_version; }; /** NetworkTables RPC Parameter Definition */ struct NT_RpcParamDef { struct NT_String name; struct NT_Value def_value; }; /** NetworkTables RPC Result Definition */ struct NT_RpcResultDef { struct NT_String name; enum NT_Type type; }; /** NetworkTables RPC Definition */ struct NT_RpcDefinition { unsigned int version; struct NT_String name; size_t num_params; NT_RpcParamDef *params; size_t num_results; NT_RpcResultDef *results; }; /** NetworkTables RPC Call Data */ struct NT_RpcCallInfo { unsigned int rpc_id; unsigned int call_uid; struct NT_String name; struct NT_String params; }; /* * Table Functions */ /** Get Entry Value. * Returns copy of current entry value. * Note that one of the type options is "unassigned". * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param value storage for returned entry value * * It is the caller's responsibility to free value once it's no longer * needed (the utility function NT_DisposeValue() is useful for this * purpose). */ void NT_GetEntryValue(const char *name, size_t name_len, struct NT_Value *value); /** Set Entry Value. * Sets new entry value. If type of new value differs from the type of the * currently stored entry, returns error and does not update value. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param value new entry value * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryValue(const char *name, size_t name_len, const struct NT_Value *value); /** Set Entry Type and Value. * Sets new entry value. If type of new value differs from the type of the * currently stored entry, the currently stored entry type is overridden * (generally this will generate an Entry Assignment message). * * This is NOT the preferred method to update a value; generally * NT_SetEntryValue() should be used instead, with appropriate error handling. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param value new entry value */ void NT_SetEntryTypeValue(const char *name, size_t name_len, const struct NT_Value *value); /** Set Entry Flags. */ void NT_SetEntryFlags(const char *name, size_t name_len, unsigned int flags); /** Get Entry Flags. */ unsigned int NT_GetEntryFlags(const char *name, size_t name_len); /** Delete Entry. * Deletes an entry. This is a new feature in version 3.0 of the protocol, * so this may not have an effect if any other node in the network is not * version 3.0 or newer. * * Note: NT_GetConnections() can be used to determine the protocol version * of direct remote connection(s), but this is not sufficient to determine * if all nodes in the network are version 3.0 or newer. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes */ void NT_DeleteEntry(const char *name, size_t name_len); /** Delete All Entries. * Deletes ALL table entries. This is a new feature in version 3.0 of the * so this may not have an effect if any other node in the network is not * version 3.0 or newer. * * Note: NT_GetConnections() can be used to determine the protocol version * of direct remote connection(s), but this is not sufficient to determine * if all nodes in the network are version 3.0 or newer. */ void NT_DeleteAllEntries(void); /** Get Entry Information. * Returns an array of entry information (name, entry type, * and timestamp of last change to type/value). The results are optionally * filtered by string prefix and entry type to only return a subset of all * entries. * * @param prefix entry name required prefix; only entries whose name * starts with this string are returned * @param prefix_len length of prefix in bytes * @param types bitmask of NT_Type values; 0 is treated specially * as a "don't care" * @param count output parameter; set to length of returned array * @return Array of entry information. */ struct NT_EntryInfo *NT_GetEntryInfo(const char *prefix, size_t prefix_len, unsigned int types, size_t *count); /** Flush Entries. * Forces an immediate flush of all local entry changes to network. * Normally this is done on a regularly scheduled interval (see * NT_SetUpdateRate()). * * Note: flushes are rate limited to avoid excessive network traffic. If * the time between calls is too short, the flush will occur after the minimum * time elapses (rather than immediately). */ void NT_Flush(void); /* * Callback Creation Functions */ void NT_SetListenerOnStart(void (*on_start)(void *data), void *data); void NT_SetListenerOnExit(void (*on_exit)(void *data), void *data); typedef void (*NT_EntryListenerCallback)( unsigned int uid, void *data, const char *name, size_t name_len, const struct NT_Value *value, unsigned int flags); typedef void (*NT_ConnectionListenerCallback)( unsigned int uid, void *data, int connected, const struct NT_ConnectionInfo *conn); unsigned int NT_AddEntryListener(const char *prefix, size_t prefix_len, void *data, NT_EntryListenerCallback callback, unsigned int flags); void NT_RemoveEntryListener(unsigned int entry_listener_uid); unsigned int NT_AddConnectionListener(void *data, NT_ConnectionListenerCallback callback, int immediate_notify); void NT_RemoveConnectionListener(unsigned int conn_listener_uid); int NT_NotifierDestroyed(); /* * Remote Procedure Call Functions */ void NT_SetRpcServerOnStart(void (*on_start)(void *data), void *data); void NT_SetRpcServerOnExit(void (*on_exit)(void *data), void *data); typedef char *(*NT_RpcCallback)(void *data, const char *name, size_t name_len, const char *params, size_t params_len, size_t *results_len); void NT_CreateRpc(const char *name, size_t name_len, const char *def, size_t def_len, void *data, NT_RpcCallback callback); void NT_CreatePolledRpc(const char *name, size_t name_len, const char *def, size_t def_len); int NT_PollRpc(int blocking, struct NT_RpcCallInfo* call_info); void NT_PostRpcResponse(unsigned int rpc_id, unsigned int call_uid, const char *result, size_t result_len); unsigned int NT_CallRpc(const char *name, size_t name_len, const char *params, size_t params_len); char *NT_GetRpcResult(int blocking, unsigned int call_uid, size_t *result_len); char *NT_PackRpcDefinition(const struct NT_RpcDefinition *def, size_t *packed_len); int NT_UnpackRpcDefinition(const char *packed, size_t packed_len, struct NT_RpcDefinition *def); char *NT_PackRpcValues(const struct NT_Value **values, size_t values_len, size_t *packed_len); struct NT_Value **NT_UnpackRpcValues(const char *packed, size_t packed_len, const NT_Type *types, size_t types_len); /* * Client/Server Functions */ void NT_SetNetworkIdentity(const char *name, size_t name_len); /** Start Server * Starts a server using the specified filename, listening address, and port. * * @param persist_filename the name of the persist file to use (UTF-8 string, * null terminated) * @param listen_address the address to listen on, or null to listen on any * address. (UTF-8 string, null terminated) * @param port port to communicate over. */ void NT_StartServer(const char *persist_filename, const char *listen_address, unsigned int port); /** Stop Server * Stops the server if it is running. */ void NT_StopServer(void); /** Starts Client * Starts a client using the specified server and port * * @param server_name server name (UTF-8 string, null terminated) * @param port port to communicate over * */ void NT_StartClient(const char *server_name, unsigned int port); /** Stop Client * Stops the client if it is running. */ void NT_StopClient(void); /** Stop Rpc Server * Stops the Rpc server if it is running. */ void NT_StopRpcServer(void); /** Stop Notifier * Stops the Notifier (Entry and Connection Listener) thread if it is running. */ void NT_StopNotifier(void); /** Set Update Rate * Sets the update rate of the table * * @param interval the interval to update the table at (in seconds) * */ void NT_SetUpdateRate(double interval); /** Get Connections * Gets an array of all the connections in the table. * * @param count returns the number of elements in the array * @return an array containing all the connections. * * It is the caller's responsibility to free the array. The * NT_DisposeConnectionInfoArray function is useful for this purpose. */ struct NT_ConnectionInfo *NT_GetConnections(size_t *count); /* * Persistent Functions */ /* return error string, or NULL if successful */ const char *NT_SavePersistent(const char *filename); const char *NT_LoadPersistent(const char *filename, void (*warn)(size_t line, const char *msg)); /* * Utility Functions */ /* frees value memory */ void NT_DisposeValue(struct NT_Value *value); /* sets type to unassigned and clears rest of struct */ void NT_InitValue(struct NT_Value *value); /* frees string memory */ void NT_DisposeString(struct NT_String *str); /* sets length to zero and pointer to null */ void NT_InitString(struct NT_String *str); /* Gets the type for the specified key, or unassigned if non existent. */ enum NT_Type NT_GetType(const char *name, size_t name_len); /** Dispose Connection Info Array * Disposes a connection info array * * @param arr pointer to the array to dispose * @param count number of elements in the array * */ void NT_DisposeConnectionInfoArray(struct NT_ConnectionInfo *arr, size_t count); /** Dispose Entry Info Array * Disposes an entry info array * * @param arr pointer to the array to dispose * @param count number of elements in the array * */ void NT_DisposeEntryInfoArray(struct NT_EntryInfo *arr, size_t count); /** Dispose Rpc Definition * Disposes a Rpc Definition structure * * @param def pointer to the struct to dispose * */ void NT_DisposeRpcDefinition(struct NT_RpcDefinition *def); /** Dispose Rpc Call Info * Disposes a Rpc Call Info structure * * @param def pointer to the struct to dispose * */ void NT_DisposeRpcCallInfo(struct NT_RpcCallInfo *call_info); /* timestamp */ unsigned long long NT_Now(void); /* logging */ typedef void (*NT_LogFunc)(unsigned int level, const char *file, unsigned int line, const char *msg); void NT_SetLogger(NT_LogFunc func, unsigned int min_level); /* * Interop Utility Functions */ /* Memory Allocators */ /** Allocate Character Array * Allocates an array of chars. * Note that the size is the number of elements, and not the * specific number of bytes to allocate. That is calculated internally. * * @param size the number of elements the array will contain * @return the allocated char array * * After use, the array should be freed using the NT_FreeCharArray() * function. */ char *NT_AllocateCharArray(size_t size); /** Allocate Boolean Array * Allocates an array of booleans. * Note that the size is the number of elements, and not the * specific number of bytes to allocate. That is calculated internally. * * @param size the number of elements the array will contain * @return the allocated boolean array * * After use, the array should be freed using the NT_FreeBooleanArray() * function. */ int *NT_AllocateBooleanArray(size_t size); /** Allocate Double Array * Allocates an array of doubles. * Note that the size is the number of elements, and not the * specific number of bytes to allocate. That is calculated internally. * * @param size the number of elements the array will contain * @return the allocated double array * * After use, the array should be freed using the NT_FreeDoubleArray() * function. */ double *NT_AllocateDoubleArray(size_t size); /** Allocate NT_String Array * Allocates an array of NT_Strings. * Note that the size is the number of elements, and not the * specific number of bytes to allocate. That is calculated internally. * * @param size the number of elements the array will contain * @return the allocated NT_String array * * After use, the array should be freed using the NT_FreeStringArray() * function. */ struct NT_String *NT_AllocateStringArray(size_t size); /** Free Char Array * Frees an array of chars. * * @param v_boolean pointer to the char array to free */ void NT_FreeCharArray(char *v_char); /** Free Double Array * Frees an array of doubles. * * @param v_boolean pointer to the double array to free */ void NT_FreeDoubleArray(double *v_double); /** Free Boolean Array * Frees an array of booleans. * * @param v_boolean pointer to the boolean array to free */ void NT_FreeBooleanArray(int *v_boolean); /** Free String Array * Frees an array of NT_Strings. * * @param v_string pointer to the string array to free * @param arr_size size of the string array to free * * Note that the individual NT_Strings in the array should NOT be * freed before calling this. This function will free all the strings * individually. */ void NT_FreeStringArray(struct NT_String *v_string, size_t arr_size); /** Get Value Type * Returns the type of an NT_Value struct. * Note that one of the type options is "unassigned". * * @param value The NT_Value struct to get the type from. * @return The type of the value, or unassigned if null. */ enum NT_Type NT_GetValueType(const struct NT_Value *value); /** Get Value Boolean * Returns the boolean from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns 0. * * @param value NT_Value struct to get the boolean from * @param last_change returns time in ms since the last change in the value * @param v_boolean returns the boolean assigned to the name * @return 1 if successful, or 0 if value is null or not a boolean */ int NT_GetValueBoolean(const struct NT_Value *value, unsigned long long *last_change, int *v_boolean); /** Get Value Double * Returns the double from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns 0. * * @param value NT_Value struct to get the double from * @param last_change returns time in ms since the last change in the value * @param v_double returns the boolean assigned to the name * @return 1 if successful, or 0 if value is null or not a double */ int NT_GetValueDouble(const struct NT_Value *value, unsigned long long *last_change, double *v_double); /** Get Value String * Returns a copy of the string from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns 0. * * @param value NT_Value struct to get the string from * @param last_change returns time in ms since the last change in the value * @param str_len returns the length of the string * @return pointer to the string (UTF-8), or null if error * * It is the caller's responsibility to free the string once its no longer * needed. The NT_FreeCharArray() function is useful for this purpose. The * returned string is a copy of the string in the value, and must be freed * separately. */ char *NT_GetValueString(const struct NT_Value *value, unsigned long long *last_change, size_t *str_len); /** Get Value Raw * Returns a copy of the raw value from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns null. * * @param value NT_Value struct to get the string from * @param last_change returns time in ms since the last change in the value * @param raw_len returns the length of the string * @return pointer to the raw value (UTF-8), or null if error * * It is the caller's responsibility to free the raw value once its no longer * needed. The NT_FreeCharArray() function is useful for this purpose. The * returned string is a copy of the string in the value, and must be freed * separately. */ char *NT_GetValueRaw(const struct NT_Value *value, unsigned long long *last_change, size_t *raw_len); /** Get Value Boolean Array * Returns a copy of the boolean array from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns null. * * @param value NT_Value struct to get the boolean array from * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the boolean array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeBooleanArray() function is useful for this purpose. * The returned array is a copy of the array in the value, and must be * freed separately. */ int *NT_GetValueBooleanArray(const struct NT_Value *value, unsigned long long *last_change, size_t *arr_size); /** Get Value Double Array * Returns a copy of the double array from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns null. * * @param value NT_Value struct to get the double array from * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the double array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeDoubleArray() function is useful for this purpose. * The returned array is a copy of the array in the value, and must be * freed separately. */ double *NT_GetValueDoubleArray(const struct NT_Value *value, unsigned long long *last_change, size_t *arr_size); /** Get Value String Array * Returns a copy of the NT_String array from the NT_Value. * If the NT_Value is null, or is assigned to a different type, returns null. * * @param value NT_Value struct to get the NT_String array from * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the NT_String array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeStringArray() function is useful for this purpose. * The returned array is a copy of the array in the value, and must be * freed seperately. Note that the individual NT_Strings should not be freed, * but the entire array should be freed at once. The NT_FreeStringArray() * function will free all the NT_Strings. */ NT_String *NT_GetValueStringArray(const struct NT_Value *value, unsigned long long *last_change, size_t *arr_size); /** Get Entry Boolean * Returns the boolean currently assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns 0. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param v_boolean returns the boolean assigned to the name * @return 1 if successful, or 0 if value is unassigned or not a * boolean */ int NT_GetEntryBoolean(const char *name, size_t name_len, unsigned long long *last_change, int *v_boolean); /** Get Entry Double * Returns the double currently assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns 0. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param v_double returns the double assigned to the name * @return 1 if successful, or 0 if value is unassigned or not a * double */ int NT_GetEntryDouble(const char *name, size_t name_len, unsigned long long *last_change, double *v_double); /** Get Entry String * Returns a copy of the string assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns null. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param str_len returns the length of the string * @return pointer to the string (UTF-8), or null if error * * It is the caller's responsibility to free the string once its no longer * needed. The NT_FreeCharArray() function is useful for this purpose. */ char *NT_GetEntryString(const char *name, size_t name_len, unsigned long long *last_change, size_t *str_len); /** Get Entry Raw * Returns a copy of the raw value assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns null. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param raw_len returns the length of the string * @return pointer to the raw value (UTF-8), or null if error * * It is the caller's responsibility to free the raw value once its no longer * needed. The NT_FreeCharArray() function is useful for this purpose. */ char *NT_GetEntryRaw(const char *name, size_t name_len, unsigned long long *last_change, size_t *raw_len); /** Get Entry Boolean Array * Returns a copy of the boolean array assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns null. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the boolean array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeBooleanArray() function is useful for this purpose. */ int *NT_GetEntryBooleanArray(const char *name, size_t name_len, unsigned long long *last_change, size_t *arr_size); /** Get Entry Double Array * Returns a copy of the double array assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns null. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the double array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeDoubleArray() function is useful for this purpose. */ double *NT_GetEntryDoubleArray(const char *name, size_t name_len, unsigned long long *last_change, size_t *arr_size); /** Get Entry String Array * Returns a copy of the NT_String array assigned to the entry name. * If the entry name is not currently assigned, or is assigned to a * different type, returns null. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param last_change returns time in ms since the last change in the value * @param arr_size returns the number of elements in the array * @return pointer to the NT_String array, or null if error * * It is the caller's responsibility to free the array once its no longer * needed. The NT_FreeStringArray() function is useful for this purpose. Note * that the individual NT_Strings should not be freed, but the entire array * should be freed at once. The NT_FreeStringArray() function will free all the * NT_Strings. */ NT_String *NT_GetEntryStringArray(const char *name, size_t name_len, unsigned long long *last_change, size_t *arr_size); /* Entry Value Setters */ /** Set Entry Boolean * Sets an entry boolean. If the entry name is not currently assigned to a * boolean, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param v_boolean boolean value to set * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryBoolean(const char *name, size_t name_len, int v_boolean, int force); /** Set Entry Double * Sets an entry double. If the entry name is not currently assigned to a * double, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param v_double double value to set * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryDouble(const char *name, size_t name_len, double v_double, int force); /** Set Entry String * Sets an entry string. If the entry name is not currently assigned to a * string, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param str string to set (UTF-8 string) * @param str_len length of string to write in bytes * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryString(const char *name, size_t name_len, const char *str, size_t str_len, int force); /** Set Entry Raw * Sets the raw value of an entry. If the entry name is not currently assigned * to a raw value, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param raw raw string to set (UTF-8 string) * @param raw_len length of raw string to write in bytes * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryRaw(const char *name, size_t name_len, const char *raw, size_t raw_len, int force); /** Set Entry Boolean Array * Sets an entry boolean array. If the entry name is not currently assigned to * a boolean array, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param arr boolean array to write * @param size number of elements in the array * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryBooleanArray(const char *name, size_t name_len, const int *arr, size_t size, int force); /** Set Entry Double Array * Sets an entry double array. If the entry name is not currently assigned to * a double array, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param arr double array to write * @param size number of elements in the array * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryDoubleArray(const char *name, size_t name_len, const double *arr, size_t size, int force); /** Set Entry String Array * Sets an entry string array. If the entry name is not currently assigned to * a string array, returns error unless the force parameter is set. * * @param name entry name (UTF-8 string) * @param name_len length of name in bytes * @param arr NT_String array to write * @param size number of elements in the array * @param force 1 to force the entry to get overwritten, otherwise 0 * @return 0 on error (type mismatch), 1 on success */ int NT_SetEntryStringArray(const char *name, size_t name_len, const struct NT_String *arr, size_t size, int force); #ifdef __cplusplus } #endif #endif /* NTCORE_C_H_ */