// // aegis - project change supervisor // Copyright (C) 2004, 2007 Walter Franzini; // Copyright (C) 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 // for assert #include #include #include #include #include #include #include #include #include #include #include enum { arglex_token_generate, arglex_token_check, arglex_token_uuid_translate }; static arglex_table_ty argtab[] = { { "-Check", arglex_token_check, }, { "-GENerate", arglex_token_generate, }, { "-Translate", arglex_token_uuid_translate, }, ARGLEX_END_MARKER }; static void usage(void) { const char *progname; progname = progname_get(); fprintf ( stderr, "Usage: %s [ -GENerate | -CHEck | -Translate] [input [output]]\n", progname ); exit(EXIT_FAILURE); } static int generate_uuid(const nstring &, const nstring &ofn) { trace_nstring(ofn); nstring uuid(universal_unique_identifier()); assert(!uuid.empty()); os_become_orig(); output::pointer ofp = output_file::open(ofn); if (!ofp) fatal_raw("Unable to open %s from writing", ofn.c_str()); ofp->fputs(uuid); ofp->end_of_line(); os_become_undo(); return 1; } static int check_uuid(const nstring &ifn, const nstring &) { os_become_orig(); input ifp = input_file_open(ifn); nstring uuid; if (!ifp->one_line(uuid)) fatal_raw("Unable to read uuid from %s", ifn.c_str()); os_become_undo(); return universal_unique_identifier_valid(uuid); } static int translate_uuid(const nstring &ifn, const nstring &ofn) { os_become_orig(); input ifp = input_file_open(ifn); output::pointer ofp = output_file::open(ofn); nstring uuid; if (!ifp->one_line(uuid)) fatal_raw("Unable to read uuid from %s", ifn.c_str()); ofp->fputs(uuid_translate(uuid)); ofp->end_of_line(); ofp.reset(); os_become_undo(); return 1; } int main(int argc, char **argv) { int (*func)(const nstring &, const nstring &); arglex_init(argc, argv, argtab); nstring ifn; nstring ofn; func = NULL; arglex(); os_become_init_mortal(); while (arglex_token != arglex_token_eoln) { switch (arglex_token) { case arglex_token_stdio: if (ifn.empty()) ifn = nstring(""); else if (ofn.empty()) ofn = nstring(""); else usage(); break; case arglex_token_string: if (ifn.empty()) ifn = nstring(arglex_value.alv_string); else if (ofn.empty()) ofn = nstring(arglex_value.alv_string); else usage(); break; case arglex_token_generate: func = generate_uuid; break; case arglex_token_check: func = check_uuid; break; case arglex_token_uuid_translate: func = translate_uuid; break; default: generic_argument(usage); break; } arglex(); } if (!func) usage(); int ret = func(ifn, ofn); exit(ret ? EXIT_SUCCESS : EXIT_FAILURE); }