12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- * Dealing with identifiers
- *
- * Copyright (C) 2014 Red Hat, Inc.
- *
- * Authors:
- * Markus Armbruster <armbru@redhat.com>,
- *
- * This work is licensed under the terms of the GNU LGPL, version 2.1
- * or later. See the COPYING.LIB file in the top-level directory.
- */
- #include "qemu/osdep.h"
- #include "qemu/ctype.h"
- #include "qemu/id.h"
- bool id_wellformed(const char *id)
- {
- int i;
- if (!qemu_isalpha(id[0])) {
- return false;
- }
- for (i = 1; id[i]; i++) {
- if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
- return false;
- }
- }
- return true;
- }
- #define ID_SPECIAL_CHAR '#'
- static const char *const id_subsys_str[ID_MAX] = {
- [ID_QDEV] = "qdev",
- [ID_BLOCK] = "block",
- };
- /*
- * Generates an ID of the form PREFIX SUBSYSTEM NUMBER
- * where:
- *
- * - PREFIX is the reserved character '#'
- * - SUBSYSTEM identifies the subsystem creating the ID
- * - NUMBER is a decimal number unique within SUBSYSTEM.
- *
- * Example: "#block146"
- *
- * Note that these IDs do not satisfy id_wellformed().
- *
- * The caller is responsible for freeing the returned string with g_free()
- */
- char *id_generate(IdSubSystems id)
- {
- static uint64_t id_counters[ID_MAX];
- uint32_t rnd;
- assert(id < ARRAY_SIZE(id_subsys_str));
- assert(id_subsys_str[id]);
- rnd = g_random_int_range(0, 100);
- return g_strdup_printf("%c%s%" PRIu64 "%02" PRId32, ID_SPECIAL_CHAR,
- id_subsys_str[id],
- id_counters[id]++,
- rnd);
- }
|