UserInterface/main [ Functions ]
FUNCTION
Get and parse the arguments. Analyse document and generate the documentation. Everything starts from here.
SYNOPSIS
int main( int argc, char **argv )
SOURCE
{ struct RB_Document *document = NULL; struct RB_Directory *srctree = NULL; char *optstr = NULL; char *used_rc_file = NULL; long debug = 0; /* TODO, make setlocale work. char * loc; if ( (loc = getenv("LC_CTYPE") ) != NULL ) { printf( ".... %s\n", loc ); setlocale( LC_ALL, loc); } else { setlocale(LC_ALL, ""); } */ whoami = argv[0]; /* global me,myself&i */ // Init Actions global course_of_action = No_Actions( ); /* Read the configuration file. This might contain addition options. */ RB_SetCurrentFile( NULL ); used_rc_file = ReadConfiguration( argc, argv, RB_Find_In_Argv_Parameterized_Option ( argc, argv, "--rc" ) ); /* Force debug mode early if the user wants the debug mode */ debugmode = Find_DebugMode( ); if ( Check_Options( ) == EXIT_FAILURE ) { return EXIT_FAILURE; } if ( Find_Option( "-c" ) ) { printf( "%s", copying ); return EXIT_SUCCESS; } if ( Find_Option( "--version" ) ) { dump_version( ); return EXIT_SUCCESS; } if ( Find_Option( "--help" ) ) { printf( "%s%s%s%s%s%s", use, use_usage, use_options1, use_options2, use_options3, use_authors ); return EXIT_SUCCESS; } output_mode = Find_DocType( ); /* one of the globals that are still left */ if ( output_mode == UNKNOWN ) { Print_Short_Use( ); return EXIT_SUCCESS; } /* First the basics. */ document = RB_Get_RB_Document( ); document->doctype = output_mode; document->actions = Find_Actions( ); debug = document->debugmode = Find_DebugMode( ); document->charset = Find_Parameterized_Option( "--charset" ); document->extension = Find_Parameterized_Option( "--ext" ); document->css = Find_Parameterized_Option( "--css" ); document->compress = Find_Parameterized_Option( "--compress" ); document->section = Find_Parameterized_Option( "--mansection" ); document_title = Find_Parameterized_Option( "--documenttitle" ); optstr = Find_Parameterized_Option( "--first_section_level" ); if ( optstr ) { document->first_section_level = atoi( optstr ); } course_of_action = document->actions; /* a global */ debugmode = document->debugmode; /* a global */ RB_Say( "Using %s for defaults\n", SAY_INFO, used_rc_file ); free( used_rc_file ); /* No longer necessary */ used_rc_file = NULL; if ( document->css ) { document->css = Path_Convert_Win32_to_Unix( document->css ); } if ( ( document->actions.do_index ) && output_mode == TROFF ) { RB_Warning( "Index generation not supported for TROFF format.\n" ); document->actions.do_index = FALSE; } if ( Find_Parameterized_Option( "--doctype_name" ) && Find_Parameterized_Option( "--doctype_location" ) ) { document->doctype_name = Find_Parameterized_Option( "--doctype_name" ); document->doctype_location = Find_Parameterized_Option( "--doctype_location" ); } // Find tab sizes and tab stops Find_Tabstops( ); // Find master index file name Find_And_Install_Document_Name( "--masterindex", HT_MASTERINDEXTYPE ); // Find source index file name Find_And_Install_Document_Name( "--sourceindex", HT_SOURCEHEADERTYPE ); // Find DOT tool name optstr = Find_Parameterized_Option( "--dotname" ); if ( optstr ) { dot_name = optstr; } // Find number of headers before linebreak optstr = Find_Parameterized_Option( "--header_breaks" ); if ( optstr ) { int breaks = atoi( optstr ); if ( breaks == 0 ) { breaks = MAX_HEADER_BREAKS; } header_breaks = breaks; } // Get extension if ( !document->extension ) { document->extension = RB_Get_Default_Extension( document->doctype ); } /* Test if there is a --src and --doc */ if ( !Find_Parameterized_Option( "--src" ) ) { printf( "Error: you need to specify a source" " file or directory with --src.\n" ); Print_Short_Use( ); return EXIT_FAILURE; } if ( !Find_Parameterized_Option( "--doc" ) ) { printf( "Error: you need to specify a documentation file" " or directory with --doc.\n" ); Print_Short_Use( ); return EXIT_FAILURE; } /* What mode are we using? */ if ( Find_Option( "--multidoc" ) ) { char *srcrootname; /* directory */ char *docrootname; srcrootname = Find_And_Fix_Path( "--src" ); if ( !Stat_Path( 'e', srcrootname ) ) { printf( "Error: %s does not exists\n", srcrootname ); Print_Short_Use( ); return EXIT_FAILURE; } if ( !Stat_Path( 'd', srcrootname ) ) { printf( "Error: %s is not a directory\n", srcrootname ); Print_Short_Use( ); return EXIT_FAILURE; } document->srcroot = RB_Get_RB_Path( srcrootname ); docrootname = Find_And_Fix_Path( "--doc" ); Path_Check( srcrootname, docrootname ); document->docroot = RB_Get_RB_Path( docrootname ); srctree = RB_Get_RB_Directory( srcrootname, docrootname ); document->srctree = srctree; RB_Document_Create_Parts( document ); RB_Analyse_Document( document ); RB_Generate_Documentation( document ); RB_Free_RB_Path( document->srcroot ); document->srcroot = 0; RB_Free_RB_Path( document->docroot ); document->docroot = 0; RB_Free_RB_Directory( srctree ); document->srctree = 0; } else if ( output_mode == TROFF ) { RB_Panic( "Only --multidoc is supported for TROFF output.\n" ); } else if ( Find_Option( "--singledoc" ) ) { char *srcrootname; /* directory */ srcrootname = Find_And_Fix_Path( "--src" ); if ( !Stat_Path( 'e', srcrootname ) ) { printf( "Error: %s does not exists\n", srcrootname ); Print_Short_Use( ); return EXIT_FAILURE; } if ( !Stat_Path( 'd', srcrootname ) ) { printf( "Error: %s is not a directory\n", srcrootname ); Print_Short_Use( ); return EXIT_FAILURE; }; document->srcroot = RB_Get_RB_Path( srcrootname ); document->docroot = 0; document->singledoc_name = Find_And_Fix_Path( "--doc" ); srctree = RB_Get_RB_Directory( srcrootname, NULL ); document->srctree = srctree; RB_Document_Create_Parts( document ); RB_Analyse_Document( document ); RB_Generate_Documentation( document ); RB_Free_RB_Directory( srctree ); } else if ( Find_Option( "--singlefile" ) ) { char *srcfile; /* file */ char *docfile; /* file */ document->docroot = 0; docfile = Find_And_Fix_Path( "--doc" ); document->singledoc_name = docfile; srcfile = Find_And_Fix_Path( "--src" ); if ( !Stat_Path( 'e', srcfile ) ) { printf( "Error: %s does not exists\n", srcfile ); Print_Short_Use( ); return EXIT_FAILURE; }; if ( !Stat_Path( 'f', srcfile ) ) { printf( "Error: %s is not a file\n", srcfile ); Print_Short_Use( ); return EXIT_FAILURE; }; document->srctree = RB_Get_RB_SingleFileDirectory( srcfile ); document->srcroot = RB_Get_RB_Path( document->srctree->first_path->name ); RB_Document_Create_Parts( document ); RB_Analyse_Document( document ); RB_Generate_Documentation( document ); RB_Free_RB_Directory( document->srctree ); } else { Print_Short_Use( ); printf ( "\n\nError: Use either --multidoc, --singledoc, or --singlefile\n" ); return EXIT_FAILURE; } RB_Summary( document ); RB_Free_RB_Document( document ); Free_Configuration( ); #ifdef __APPLE__ /* Mac OS X specific: print memory leaks */ if ( debug & SAY_DEBUG ) { char cmd[32]; sprintf( cmd, "/usr/bin/leaks %d", getpid( ) ); system( cmd ); } #endif /* __APPLE__ */ return EXIT_SUCCESS; }