void vdl_memmove (void *dst, const void *src, size_t len) { uint8_t *ss = (uint8_t *)src; uint8_t *se = ss + len; uint8_t *ds = (uint8_t *)dst; uint8_t *de = ds + len; if (ss > de || se <= ds) { // no overlap vdl_memcpy (dst, src, len); } else if (de > se) { // overlap unsigned long size = (unsigned long)de - (unsigned long)se; vdl_memcpy (de - size, se - size, size); // recursively finish the copy vdl_memmove (dst, src, len - size); } else if (ds < ss) { // overlap unsigned long size = (unsigned long)ss - (unsigned long)ds; vdl_memcpy (ds, ss, size); // recursively finish the copy vdl_memmove (ds+size, ss+size, len - size); } else { int *p = 0; *p = 0; } }
void glibc_initialize (void) { void **(*fn) (void) = vdl_dl_error_catch_tsd; char *dst = &_rtld_local[CONFIG_DL_ERROR_CATCH_TSD_OFFSET]; vdl_memcpy ((void*)dst, &fn, sizeof (fn)); char *off = &_rtld_local_ro[CONFIG_RTLD_DL_PAGESIZE_OFFSET]; int pgsz = system_getpagesize (); vdl_memcpy (off, &pgsz, sizeof (pgsz)); }
struct VdlList * vdl_utils_strsplit (const char *value, char separator) { VDL_LOG_FUNCTION ("value=%s, separator=%d", (value == 0) ? "" : value, separator); struct VdlList *list = vdl_list_new (); const char *prev = value; const char *cur = value; if (value == 0) { return list; } while (1) { size_t prev_len; char *str; while (*cur != separator && *cur != 0) { cur++; } prev_len = cur - prev; str = vdl_alloc_malloc (prev_len + 1); vdl_memcpy (str, prev, prev_len); str[prev_len] = 0; vdl_list_push_back (list, str); if (*cur == 0) { break; } cur++; prev = cur; } return list; }
char * vdl_utils_strdup (const char *str) { if (str == 0) { return 0; } //VDL_LOG_FUNCTION ("str=%s", str); int len = vdl_utils_strlen (str); char *retval = vdl_alloc_malloc (len + 1); vdl_memcpy (retval, str, len + 1); return retval; }
char * vdl_utils_strconcat (const char *str, ...) { VDL_LOG_FUNCTION ("str=%s", str); va_list l1, l2; uint32_t size; char *cur, *retval, *tmp; size = vdl_utils_strlen (str); va_start (l1, str); va_copy (l2, l1); // calculate size of final string cur = va_arg (l1, char *); while (cur != 0) { size += vdl_utils_strlen (cur); cur = va_arg (l1, char *); } va_end (l1); retval = vdl_alloc_malloc (size + 1); // copy first string tmp = retval; vdl_memcpy (tmp, str, vdl_utils_strlen (str)); tmp += vdl_utils_strlen (str); // concatenate the other strings. cur = va_arg (l2, char *); while (cur != 0) { vdl_memcpy (tmp, cur, vdl_utils_strlen (cur)); tmp += vdl_utils_strlen (cur); cur = va_arg (l2, char *); } // append final 0 *tmp = 0; va_end (l2); return retval; }