00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "ShortIdBlock.H"
00029 #include "VestaConfig.H"
00030 #include "Basics.H"
00031 #include <stdio.h>
00032
00033 using std::cerr;
00034 using std::endl;
00035
00036 static Text sid_dir;
00037 static int sid_dir_len;
00038 static pthread_once_t once = PTHREAD_ONCE_INIT;
00039
00040 extern "C"
00041 {
00042 static void
00043 ShortIdBlockInit()
00044 {
00045 try {
00046 bool ok = VestaConfig::get("Repository", "sid_dir", sid_dir);
00047 if (!ok) sid_dir = "";
00048 sid_dir_len = sid_dir.Length();
00049 } catch (VestaConfig::failure f) {
00050 cerr << "VestaConfig::failure " << f.msg << endl;
00051 throw;
00052 }
00053 }
00054 }
00055
00056
00057 ShortId ShortIdBlock::assignNextAvail() throw ()
00058 {
00059 for (;;) {
00060 if (next >= start + size) {
00061 return NullShortId;
00062 } else if (!assigned(next)) {
00063 set(next);
00064 return next++;
00065 } else {
00066 next++;
00067 }
00068 }
00069 }
00070
00071 char* ShortIdBlock::shortIdToName(ShortId sid, const char* prepend) throw ()
00072 {
00073
00074
00075
00076
00077
00078
00079
00080 pthread_once(&once, ShortIdBlockInit);
00081 char* retval = NEW_PTRFREE_ARRAY(char, sid_dir_len + strlen(prepend) + 11);
00082 sprintf(retval, "%s%s%03x%c%03x%c%02x",
00083 prepend, sid_dir.cchars(),
00084 (sid >> 20) & 0xfff, PathnameSep,
00085 (sid >> 8) & 0xfff, PathnameSep,
00086 sid & 0xff);
00087 return retval;
00088 }