The ovm_vstr_t
type is the OrchIDS type of virtual character strings. Strings are fixed-size arrays of chars, and are implemented as the ovm_str_t
type. On the opposite, virtual character strings are merely pointers to a subinterval of an actual character string.
It is defined this way in src/lang.h:
typedef struct ovm_vstr_s ovm_vstr_t; struct ovm_vstr_s { gc_header_t gc; ovm_var_t *delegate; size_t len; char *str; };
Typically, the delegate
field will be a non-NULL
object of type ovm_str_t
, holding a character string; the str
field points into the latter string, and the len
field is meant to tell how many bytes we wish to actually consider for a substring. In general, if the delegate
field is non-NULL
, it should be an object that should be marked by the garbage collector if we wish the str
field to keep pointing to some valid string. For example, in issdl_vstr_from_regex
, the delegate
field is made to point to an object of type ovm_regex_t
, and the str
field points into its regex_str
string.
If the delegate
field is NULL
, then the str
field must point into some global, constant array of chars. Don’t make it point to any other kind of data: if you deallocate the latter (either manually, or if you let the garbage collector do it), str
will be left as a dangling pointer.
The type ovm_vstr_t
is a type of garbage-collectable data. To allocate a new object of type ovm_vstr_t
, use the function:
ovm_var_t *ovm_vstr_new(gc_t *gc_ctx, ovm_var_t *delegate);
This creates a new ovm_vstr_t
objecvt, with the given delegate
. Calling res
the result, one always has TYPE(res)==T_VSTR
. The actual len
and str
fields are left uninitialized. One can access them using VSTRLEN(res)
and VSTR(res)
, respectively, both to write into or to read from.
The return type of ovm_vstr_new()
is the universal type ovm_var_t
instead of ovm_vstr_t
, for practical reasons.
The result is created white, and much be gc_touch()
ed before storing it into a garbage-collectable object.