| /* | |
| * 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", | |
| [ID_CHR] = "chr", | |
| [ID_NET] = "net", | |
| }; | |
| /* | |
| * 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); | |
| } |