// // aegis - project change supervisor // Copyright (C) 2004-2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include static int safe_tolower(int c) { unsigned char uc; // // The ANSI C standard only guarantees that tolower works for // characters for which isupper is true. All other characters // result in undefined behaviour (some, but by NO means all, lib C // implementations pass all other characters through unscathed). // // This is performed in the C locale, no need for // language_human/language_C bracketing. // // We even though the characters are supposed to be lower case // already, we can't take any chances with the names of the history // files, or things will rapidly become unglued. // uc = c; if (isupper(uc)) return tolower(uc); return uc; } string_ty * project_history_uuid_translate(fstate_src_ty *src) { char buffer[46]; assert(src); assert(src->file_name); if (!src->uuid) return str_copy(src->file_name); assert(src->uuid); assert(universal_unique_identifier_valid(src->uuid)); // // The UUID // aabbcccc-cccc-ddde-eeee-eeefffgggggg // becomes // aa.uui/bb.uui/cccccccc.ddd/eeeeeeee.fff/gggggg // // The idea is that we have two sparsely populated directories at // the top that are quick to search (the names are random, it gets // exponentially less likely the deeper you go) followed by as few // densely populated directories as possible. The really ugly // names are to avoid backwards compatibility issues. // // The file names have been designed so that we will work even on // the most brain-dead 8.3 file system. // assert(src->uuid->str_length == 36); buffer[ 0] = safe_tolower(src->uuid->str_text[ 0]); buffer[ 1] = safe_tolower(src->uuid->str_text[ 1]); buffer[ 2] = '.'; buffer[ 3] = 'u'; buffer[ 4] = 'u'; buffer[ 5] = 'i'; buffer[ 6] = '/'; buffer[ 7] = safe_tolower(src->uuid->str_text[ 2]); buffer[ 8] = safe_tolower(src->uuid->str_text[ 3]); buffer[ 9] = '.'; buffer[10] = 'u'; buffer[11] = 'u'; buffer[12] = 'i'; buffer[13] = '/'; buffer[14] = safe_tolower(src->uuid->str_text[ 4]); buffer[15] = safe_tolower(src->uuid->str_text[ 5]); buffer[16] = safe_tolower(src->uuid->str_text[ 6]); buffer[17] = safe_tolower(src->uuid->str_text[ 7]); assert(src->uuid->str_text[8] == '-'); buffer[18] = safe_tolower(src->uuid->str_text[ 9]); buffer[19] = safe_tolower(src->uuid->str_text[10]); buffer[20] = safe_tolower(src->uuid->str_text[11]); buffer[21] = safe_tolower(src->uuid->str_text[12]); assert(src->uuid->str_text[13] == '-'); buffer[22] = '.'; buffer[23] = safe_tolower(src->uuid->str_text[14]); buffer[24] = safe_tolower(src->uuid->str_text[15]); buffer[25] = safe_tolower(src->uuid->str_text[16]); buffer[26] = '/'; buffer[27] = safe_tolower(src->uuid->str_text[17]); assert(src->uuid->str_text[18] == '-'); buffer[28] = safe_tolower(src->uuid->str_text[19]); buffer[29] = safe_tolower(src->uuid->str_text[20]); buffer[30] = safe_tolower(src->uuid->str_text[21]); buffer[31] = safe_tolower(src->uuid->str_text[22]); assert(src->uuid->str_text[23] == '-'); buffer[32] = safe_tolower(src->uuid->str_text[24]); buffer[33] = safe_tolower(src->uuid->str_text[25]); buffer[34] = safe_tolower(src->uuid->str_text[26]); buffer[35] = '.'; buffer[36] = safe_tolower(src->uuid->str_text[27]); buffer[37] = safe_tolower(src->uuid->str_text[28]); buffer[38] = safe_tolower(src->uuid->str_text[29]); buffer[39] = '/'; buffer[40] = safe_tolower(src->uuid->str_text[30]); buffer[41] = safe_tolower(src->uuid->str_text[31]); buffer[42] = safe_tolower(src->uuid->str_text[32]); buffer[43] = safe_tolower(src->uuid->str_text[33]); buffer[44] = safe_tolower(src->uuid->str_text[34]); buffer[45] = safe_tolower(src->uuid->str_text[35]); // // Make sure the last filename component doesn't look like a number. // FHist can't cope with module names which look like numbers. // if ( isdigit(buffer[40]) && isdigit(buffer[41]) && isdigit(buffer[42]) && isdigit(buffer[43]) && isdigit(buffer[44]) && isdigit(buffer[45]) ) { buffer[40] += 'z' - '0' - 9; } // // Form it into a string. // return str_n_from_c(buffer, 46); }