| /* |
| * 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-common.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_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 < ID_MAX); |
| 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); |
| } |