blob: 031f6b12cb0fdfeac7b70c87172b186b0f61c10b [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
Benny Prijonoa771a512007-02-19 01:13:53 +00003 * Copyright (C)2003-2007 Benny Prijono <benny@prijono.org>
Benny Prijono9033e312005-11-21 02:08:39 +00004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include <pj/guid.h>
Benny Prijono8389c312008-02-21 21:36:34 +000020#include <pj/assert.h>
Benny Prijono9033e312005-11-21 02:08:39 +000021#include <pj/rand.h>
Benny Prijono8389c312008-02-21 21:36:34 +000022#include <pj/os.h>
Benny Prijono9033e312005-11-21 02:08:39 +000023#include <pj/string.h>
Benny Prijono9033e312005-11-21 02:08:39 +000024
Benny Prijono8389c312008-02-21 21:36:34 +000025PJ_DEF_DATA(const unsigned) PJ_GUID_STRING_LENGTH=32;
26
27static char guid_chars[64];
Benny Prijono1f61a8f2007-08-16 10:11:44 +000028
29PJ_DEF(unsigned) pj_GUID_STRING_LENGTH()
30{
31 return PJ_GUID_STRING_LENGTH;
32}
Benny Prijono9033e312005-11-21 02:08:39 +000033
Benny Prijono8389c312008-02-21 21:36:34 +000034static void init_guid_chars(void)
Benny Prijono9033e312005-11-21 02:08:39 +000035{
Benny Prijono8389c312008-02-21 21:36:34 +000036 char *p = guid_chars;
37 unsigned i;
Benny Prijono9033e312005-11-21 02:08:39 +000038
Benny Prijono8389c312008-02-21 21:36:34 +000039 for (i=0; i<10; ++i)
40 *p++ = '0'+i;
41
42 for (i=0; i<26; ++i) {
43 *p++ = 'a'+i;
44 *p++ = 'A'+i;
45 }
46
47 *p++ = '-';
48 *p++ = '.';
Benny Prijono9033e312005-11-21 02:08:39 +000049}
50
51PJ_DEF(pj_str_t*) pj_generate_unique_string(pj_str_t *str)
52{
Benny Prijono8389c312008-02-21 21:36:34 +000053 char *p, *end;
Benny Prijono9033e312005-11-21 02:08:39 +000054
55 PJ_CHECK_STACK();
56
Benny Prijono8389c312008-02-21 21:36:34 +000057 if (guid_chars[0] == '\0') {
58 pj_enter_critical_section();
59 if (guid_chars[0] == '\0') {
60 init_guid_chars();
61 }
62 pj_enter_critical_section();
Benny Prijono9033e312005-11-21 02:08:39 +000063 }
64
Benny Prijono8389c312008-02-21 21:36:34 +000065 /* This would only work if PJ_GUID_STRING_LENGTH is multiple of 2 bytes */
66 pj_assert(PJ_GUID_STRING_LENGTH % 2 == 0);
Benny Prijono9033e312005-11-21 02:08:39 +000067
Benny Prijono8389c312008-02-21 21:36:34 +000068 for (p=str->ptr, end=p+PJ_GUID_STRING_LENGTH; p<end; ) {
69 /* Assumes rand() only has 16bit randomness */
70 unsigned short val = pj_rand();
71 *p++ = guid_chars[(val >> 8) & 63];
72 *p++ = guid_chars[(val & 0xFF) & 63];
73 }
74
75 str->slen = PJ_GUID_STRING_LENGTH;
Benny Prijono9033e312005-11-21 02:08:39 +000076 return str;
77}
78