/****h* Autodoc/ROBODoc [3.2] * NAME * ROBODoc -- AutoDoc formatter * COPYRIGHT * Copyright (C) 1994-2000 Frans Slothouber and Jacco van Weert. * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * FUNCTION * ROBODoc is intended to be a replacement for the original AutoDocs * program. ROBODoc will extract the procedure comment headers * from a source file, and put them into a separate documentation file. * There are five different file output formats: * ASCII * HTML (HyperText Markup Langauge) -- mainly used on the Internet; * thus the files can be viewed with a normal HTML viewer/browser * AmigaGuide -- this format can be viewed by AmigaGuide (Amiga only) * LaTeX - as input to LaTeX to produce .dvi files * RTF (Rich Text Format) -- as input to the Help compiler (Windows only) * For further information read the documentation in the archive. * AUTHOR * Frans Slothouber: . * Source code and additional extensions from version 2.0 and up. * * Petteri Kettunen: * Bug fixes, FOLD, C features. * * Jacco van Weert: * Original idea and program. * * Bernd Koesling: * Bug fixes, functional improvements, code cleanup. * * Anthon Pang: * RTF support, Bug fixes. * * Thomas Aglassinger: * Fixes and cleanup of HTML-output * * CREATION DATE * 20-Dec-94 * MODIFICATION HISTORY * Modifications by Jacco van Weert. * 19-Jan-95 - v0.8: First test beta-version * 26-Jan-95 - v0.92: 2nd test beta-version * 2-Feb-95 - v0.93: Mungwall hit, solved. * When item headers, are also available * in body then parts are duplicated solved. * Mar-95 - v1.0a: Final version * 2-Apr-95 - v1.0b: Bug fixes * Procedure header search bug solved. * Print 'created procedure' text * 20-Apr-95 - v1.1a: INTERNALONLY option added. * Sort problem solved. * Modifications by FNC Slothouber. * 10-May-1995 - v2.0a * Program completely rewritten * * added SOURCE item and LaTeX output. * * added TAB converter. * 11-May-1995 - v2.0b * Accepts headers that start with * any sequence of non-spaces. * RoboDoc should work with any * type of programming language now. * 12-May-1995 - v2.0c * Bug fixes. * 15-May-1995 - v2.0d * New Defaults file. * * Added Verbose option. * 24-May-1995 - v2.0e * Fixed a bug that cause the * CleanUp Routine to lock up. * * Improved the HTML output, * should work faster now. * Modifications by Koessi * 01-Aug-1995 - v2.0? * more robust parsing, less enforcer-hits * * removed self-referencing links ! * * remarked most changes with *koessi* * * added GoldEd-foldmarks * * compiled successfully with SAS-C 6.3 * 07-Aug-1995 - * automated foldmarks "\***" * ! GoldEd's foldmarks == RoboDoc marker ! * * quoted source parsing enhanced * 08-Aug-1995 - * a lot of while instead of for * * a lot of switch() instead of ifelse * * version defined * * RB_Say, RB_Panic now useable like printf() * new formats for nearly all output-strings * * char *whoami is global copy of argv[0] * * BOLD <- MAKE_LARGE && AMIGAGUIDE * * succesfully compiled&tested on HPUX * (HP9000/800) * * optimized listfunctions * * encapsulated header- and link- * allocating and freeing * * RB_Find_Function_Name() replaced * with RB_FilePart() * Modifications by FNC Slothouber. * 18-Aug-1995 - v3.0 * o New scanner that searches for a set default markers * that define what is a comment or what is not and that * define what or what is not a header/end marker. * o Added Beast Support * 27-Aug-1995 - v3.0b * o Fixed a bug with the defaults file * o Improved search algorithm RoboDoc is now 5.8 times faster. * 06-Sep-1995 - v3.0c * o Bug fixes * 08-Oct-1995 - v3.0d * o Bug fixes * 04-Feb-1996 - v3.0e * o fixed the problem with the TOC that included links to headers that * were not selected. (i.e internal) * Modifications by apang * 08-Mar-1996 - v3.0f * o Cleaner build for Borland C++ 4.52 * o Added more markers (C++, Pascal, Modula-2, COBOL) * o Added more item types/names * o Added #defines for the preamble (COMMENT_ROBODOC and * COMMENT_COPYRIGHT) * o BLANK_HEADER for detection of asterisk'd lines * o RB_Say() the GENERIC header warning instead of using printf() * o Indents SOURCE body in output * o ASCII respects the TOC flag; removed extraneous newline after * formfeed (so it's more like AutoDoc) * o HTML output fixed to handle '<', '>', and '&' * o LaTeX attributes and '%' handling added; fancied up the output a bit * o RTF support added * o Changed some fprintf()'s to fputc()'s for potentially lower overhead * o Fixed line eater bug * o More general fix to the TOC problem of including internal links * when it wasn't selected * Modifications by FNC Slothouber. * 01-April-1996 - v3.0h * o Added ';' to > and < so lynx also recognizes them. * o Fancied up the HTML output. * 10-July-1996 - v3.0i * o Bug Fix, Both the options INTERNAL and INTERNALONLY did not * work correctly. * Modifications by agi * 15-Dec-1997 - v3.0j * o cleaned the HTML-output, so it now conforms to the DTD for HTML-3.2 * o TOC now is an ordered list (
    and
  1. ) * o added "" * o added quotes to values of some HTML-attributes * o more compatible implementation of the SGML-comment containing * copyright-info replaced all occurrences of
    .. by 
    
     *      o replaced 

    by

    * o fixed two minor warnings reported by gcc -Wall * Modifications by FNC Slothouber. * 14-Aug-1998 - v3.0k * Tcl/Tk '#' handling added; * Feb-1999 - v3.0l * Added function to reverse the header list. * Modifications by Petteri Kettunen * Feb 1999 - v3.0m * o Changed background color to white * o Changed size of Table of Contents title. (H3 instead of H1) * o The reverse function also reversed the sorted header list, * fixed this. * Modifications by Petteri Kettunen * August 1999 - v3.0m+ * o Support for folding in SOURCE items, HTML only. * o indent -kr * o Added options FOLD and C * Modifications by FNC Slothouber. * August 1999 - v3.1 * o More documentation and a more informative usage() function. * o GPL-ed. * o robodoc -c prints licence * o removed a number of Source items from the documentation to reduce * the size of the robodoc.c.html file... no fun for people * to download a >100k file. * o removed the warning about not using a robodoc default file. * o indent -orig -i2 -nbc -ncdb -bad -bap * o Fixed the warnings. * o Fixed some occurrences of (evil cast)malloc (thou shalt not * cast malloc :) * o ROBODoc now returns EXIT_FAILURE or EXIT_SUCCESS, as defined * in * o Fixed a memory leak in RB_Analyse_Document() * Oct 1999 - v3.1b * o is generated at the beginning of * each document. A mention of the source code name in another * document creates a link to this name (provided you use xrefs). * o Moved most #defines and enums to robodoc.h * o Made ROBODoc more forgiving in reading the xrefs file. Empty * lines are allowed and also spaces at the end of a file name. * Nov 1999 - v3.1c -- From patches that I received from Stefan Kost * o renamed BEAST METHODS -> METHODS * o renamed BEAST ATTRIBUTES -> ATTRIBUTES * o added new items useful for object oriented programming; some of * these items are already used in os3.1 autodocs * TAGS, COMMANDS, DERIVED FROM, DERIVED BY, USES, * CHILDREN, USED BY, PARENTS, USAGE, PURPOSE * o commented the item names * o changed item-type enums to end all with _ITEM * o changed RB_Find_Link to accept names ending with '...' * o changed copyright comment to be a style-guide conform version string. * o changed RB_VER[] to be a style-guide conform version string * o changed AMIGA into _AMIGA, because the first one does not exists, * when compiling with NOANSI on SAS C/C++ * Dec 1999 - v3.1d * o added new header types for, classes, methods, variables, * functions, strutures and constants. (Idea of Stefan Kost) * o added a command to create a master index file that contains * sorted pointers to all classes, methods, variables, * functions, strutures and constants. * Dec 1999 - v3.1e * o added markers for HTML. * o modified the RB_Find_Link() function to also words that include * "::". This is used for C++ methods. * o added a RB_Function_Name() function that correctly extracts the * function name (or the name of any other object that is documented) * from the header name. The old code used RB_FilePart which failed * on C++ method names. * o Fixed a core-dumping bug in RB_Set_Doc_Base() * Dec 1999 - v3.1f * o added RB_TimeStamp() to include time stamps in the documentation. * o Documentation is now generated in LaTeX2e format. * o added '|****' as begin marker, '|' as remark marker and '|***' as * end marker for GNU assembler support. * o ran ident on all source. Using the GNU standard now. * o Added new fold markers provided by Petteri * May 2000 - v3.2 * o Using automake and autoconf. * o Added fixes to folding code Petteri. * o Added markers for FORTAN 90 * June 2000 - V3.2.1 * o Added patch from Simo Muinonen: This solved the following * problem: * When e.g. a field of a structured C variable (with an * underscore in its name) is referred to using the * point notation (e.g. "g_Status.tpstat"), the variable * name is not recognized as a separate keyword. This * can also happen when a keyword is in a comment at the * end of a sentence with an immediately following ".". * o Fixed the "stuctures" type in the master index file. * o Added mailto: support provided by Guillaume Etorre. * July 2000 - V3.2.2 * o Added option SINGLEDOC * For LaTeX output this generates documentation without * the start and end headers. This way the generated file * can be included in a master file. * o Added master index file for LaTeX output. The documentation * gathered from several source files can now be included into * one big file. * o Added the option NOSOURCE. With this option the SOURCE item * is not included in the documentation. * o Added the TITLE option. This allows to set the title for * the master index file. * o Made the search for headermarkers case insensitve. * REM == Rem == rem * July 2000 - V3.2.3 * o Fixed a bug that caused links of the type * "someword/anotherword," to be ignored, while * "someword/anotherword" was recognized. * Sep 2000 * o Labels with identical names are now numbered. * Apr 2001 * o The source file is opened "rb" this I hope will * make it possible to use Robodoc under windows. * (Thanks to Carlo Caminati) * * NOTES * Has been succesfully compiled: * On an Amiga with SAS/C, DICE C and gcc (Amiga 1200) * On a Sun Sparc Station with gcc (under SunOS 4.1) * On a Dec Alpha Station * Under HP/UX on a HP9000/800 * Under IRIX * On a Linux box with gcc, Slackware, Redhat, and Debian 2.1. * BUGS * - HTML output is not Lynx friendly -- attributes are applied * to leading white space =P ... solution: fix Lynx >=) * - Can't get the escape character for @ to work in * AmigaGuide format. * - Horrible use of feof() and fgets() * Other bugs? * Catch them in a jar and send them to fslothouber@acm.org * Latest version can be found on * http://robodoc.sourceforge.net * http://www.xs4all.nl/~rfsber/Robo/ * http://freshmeat.net/ * ****/ #include #include #include #include #include "robodoc.h" #include "folds.h" #include "headers.h" #include "items.h" #include "util.h" #include "links.h" #include "analyser.h" #include "generator.h" #ifdef _AMIGA char RB_VER[] = "\0$VER: robodoc " VERSION " " __AMIGADATE__ " (c) by Maverick Software Development 1994-2001"; #else char RB_VER[] = "$VER: robodoc " VERSION " (" __DATE__ ") (c) by Maverick Software Development 1994-2001"; #endif /****v* ROBODoc/source * NAME * source -- source code file. * PURPOSE * Pointer to the file with source code. * NOTES * This is a global. It is however only used by main() and * RB_Close_The_Shop(). All other functions are passed a copy. * * It is a global so that the file can be closed by * RB_Close_The_Shop() when the program exits (normally or * abnormaly). ***** */ FILE *source = NULL; /****v* ROBODoc/documentation * NAME * documentation -- documentation file. * PURPOSE * Pointer to the file that will contain the documentation extracted * from the source code. * NOTES * This is a global. It is however only used by main() and * RB_Close_The_Shop(). All other functions are passed a copy. * * It is a global so that the file can be closed by * RB_Close_The_Shop() when the program exits (normally or * abnormaly). ***** */ FILE *documentation = NULL; /****v* ROBODoc/document_title * NAME * documentat_title -- title for the documentation. * PURPOSE * Used as the title for master index files or for latex documentation. ***** */ char *document_title = NULL; /****v* ROBODoc/output_mode [2.0] * NAME * output_mode -- the mode of output * FUNCTION * Controls which type of output will be generated. * SOURCE */ int output_mode = ASCII; /*******/ /****v* ROBODoc/course_of_action [2.0] * NAME * course_of_action * FUNCTION * Global Variable that defines the course of action. * SOURCE */ int course_of_action = DO_MAKE_DOCUMENT; /*******/ /****v* ROBODoc/line_buffer [2.0] * NAME * line_buffer -- global line buffer * FUNCTION * Temporary storage area for lines * that are read from an input file. * SOURCE */ char line_buffer[MAX_LINE_LEN]; /*******/ /****v* ROBODoc/line_number [2.0] * NAME * line_number -- global line counter * PURPOSE * Keeps track of the number of lines that are read from the source file. * AUTHOR * Koessi * SOURCE */ int line_number = 0; /*******/ /****v* ROBODoc/use [3.0h] * NAME * use -- usage string * FUNCTION * Inform the user how to use ROBODoc. * AUTHOR * Koessi * SOURCE */ char use[] = "ROBODoc Version " VERSION ", autodocs formatter ($Revision$)\n" "(c) 1994-2001 Frans Slothouber and Jacco van Weert\n" "robodoc comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions; type `robodoc -c' for details.\n" "\n" "Usage:\n" " robodoc [options]\n" " or\n" " robodoc INDEX [options]\n" "\n" "You can use one or more of the following options:\n" " GENXREF - to generate an xref file.\n" " XREF - if you want to use xref files to create\n" " cross links.\n" " INDEX - create a master index file.\n" " TABSIZE - convert each TAB to nr_sp of spaces.\n" " TOC - a table of contents will be generated.\n" " SORT - the headers will be sorted.\n" " -v - tell robodoc to tell you all about it.\n" " INTERNAL - headers marked internal will also be included.\n" " INTERNALONLY - only headers marked internal will be included.\n" " FOLD - enable folding if HTML output is selected.\n" " C - Use ANSI C grammar in source items (test, HTML only).\n" "The type of output is selected with one of the following switches:\n" " ASCII, GUIDE, HTML, LATEX, or RTF\n" "If no type is specified ASCII is used.\n" "The following abbreviations are also allowed:\n" " TOC = -t XREF = -x SORT = -s INTERNAL = -i \n" " GENXREF = -g INTERNALONLY = -io TABSIZE = -ts\n" "Example:\n" " robodoc simulator.c simulator.html HTML -v TOC SORT\n" "Authors/Contributors: Frans Slothouber ," " Jacco van Weert,\n" " Petteri Kettunen, Bernd Koesling, Thomas Aglassinger, Anthon Pang, and\n" " Stefan Kost\n" "For more information, and the lastest version:\n" " http://www.xs4all.nl/~rfsber/Robo/index.html\n" " Send bug reports to .\n"; /********/ /****v* ROBODoc/copying [3.1] * NAME * copying -- licence information * FUNCTION * inform the user how to copy me * AUTHOR * Frans ******* */ char copying[] = "\n" " Distributed under the GNU GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" " See the source archive for a copy of the complete licence\n" " If you do not have it you can get it from\n" " http://freshmeat.net/appindex/1999/08/30/936003795.html\n"; /* Global variables */ char *whoami = NULL; /* me,myself&i */ int tab_size = 8; char doc_base[1024]; /* PetteriK */ /****f* ROBODoc/RB_Set_Doc_Base * NAME * RB_Set_Doc_Base -- get file name without extension. ****** */ void RB_Set_Doc_Base (char *path) { int ptr = 0, n = -1; while (path[ptr] != '\0') { if (path[ptr] == '.') { n = ptr; } ptr++; } if (n != -1) { strncpy (doc_base, path, n); } else { strcpy (doc_base, path); } RB_Say ("doc_base is \"%s\"\n", doc_base); } /****f* ROBODoc/main [2.0d] * NAME * main -- Entry point of ROBODoc * SYNOPSIS * main (int argc, char **argv) * FUNCTION * Get and parse the arguments. * Analyse document and generate the documentation. * SOURCE */ int main (int argc, char **argv) { char *file_with_xrefs, *output_file_for_xrefs; whoami = argv[0]; /* global me,myself&i */ if (argc < 2) { printf ("%s", use); } else if (argc < 3) { if (strcmp (argv[1], "-c") == 0) { printf ("%s", copying); } else { printf ("%s", use); } } else { RB_Analyse_Arguments (argc, argv, &file_with_xrefs, &output_file_for_xrefs); RB_Say ("Analysing Defaults File\n"); RB_Analyse_Defaults_File (); RB_Say ("trying to open source file \"%s\"\n", argv[1]); if ((source = fopen (argv[1], "rb")) != NULL) { if (!(course_of_action & DO_INDEX)) { RB_Say ("analysing source file \"%s\"\n", argv[1]); RB_Analyse_Document (source); RB_Number_Duplicate_Headers(); if (course_of_action & DO_SORT) { RB_Say ("sorting headers\n"); RB_Slow_Sort (); } else { RB_Reverse_List (); } if ((course_of_action & DO_USE_XREFS) && file_with_xrefs) { if ((xreffiles_file = fopen (file_with_xrefs, "r")) != NULL) { RB_Analyse_Xrefs (xreffiles_file); } else { RB_Panic ("can't open file with xref files \"%s\"\n", file_with_xrefs); } } } else { /* INDEX */ if ((xreffiles_file = fopen (argv[1], "r")) != NULL) { RB_Analyse_Xrefs (xreffiles_file); } else { RB_Panic ("can't open file with xref files \"%s\"\n", argv[1]); } } if (course_of_action & DO_MAKE_DOCUMENT) { RB_Say ("trying to open destination file \"%s\"\n", argv[2]); if ((documentation = fopen (argv[2], "w")) != NULL) { RB_Say ("generating documentation\n"); RB_Set_Doc_Base (argv[2]); RB_Generate_Documentation (documentation, RB_FilePart (argv[1]), RB_FilePart (argv[2])); fclose (documentation); documentation = NULL; } else RB_Panic ("can't open destination file \"%s\"\n", argv[2]); } else if ((course_of_action & DO_MAKE_XREFS) && output_file_for_xrefs) { RB_Say ("trying to open xref destination file \"%s\"\n", output_file_for_xrefs); if ((documentation = fopen (output_file_for_xrefs, "w")) != NULL) { RB_Say ("generating xref destination file \"%s\"\n", output_file_for_xrefs); RB_Generate_xrefs (documentation, argv[1], argv[2]); fclose (documentation); documentation = NULL; } else RB_Panic ("can't open xref destination file \"%s\"\n", output_file_for_xrefs); } else if (course_of_action & DO_INDEX) { if ((documentation = fopen (argv[2], "w")) != NULL) { RB_Generate_Index (documentation, argv[1]); fclose (documentation); documentation = NULL; } else { RB_Panic ("can't open destination file \"%s\"\n", argv[2]); } } } else RB_Panic ("can't open source file \"%s\"\n", argv[1]); } RB_Say ("Ready\n"); RB_Close_The_Shop (); return EXIT_SUCCESS; } /*****/ /****f* ROBODoc/RB_Analyse_Arguments [3.0h] * NAME * RB_Analyse_Arguments * SYNOPSIS * RB_Analyse_Arguments (argc, argv, file_with_xrefs, * output_file_for_xrefs) * RB_Analyse_Arguments (int, char **, char **, char **) * FUNCTION * Get and parse the arguments. This is a quite complex function. * It assumes that the first and second parameter are the * name of the source file and name of the documentation file * respectively. They are therefore skipped. * May modifie: output_mode, course_of_action, file_with_xrefs, * output_file_for_xrefs, document_title. * SOURCE */ void RB_Analyse_Arguments (int argc, char **argv, char **file_with_xrefs, char **output_file_for_xrefs) { char **parameter; int parameter_nr; for (parameter_nr = argc - 3, parameter = argv + 3; parameter_nr > 0; parameter++, parameter_nr--) { if (!RB_Str_Case_Cmp (*parameter, "HTML")) output_mode = HTML; else if (!RB_Str_Case_Cmp (*parameter, "GUIDE")) output_mode = AMIGAGUIDE; else if (!RB_Str_Case_Cmp (*parameter, "LATEX")) output_mode = LATEX; else if (!RB_Str_Case_Cmp (*parameter, "ASCII")) output_mode = ASCII; else if (!RB_Str_Case_Cmp (*parameter, "RTF")) output_mode = RTF; else if (!RB_Str_Case_Cmp (*parameter, "FOLD")) extra_flags |= FOLD; /* PetteriK */ else if (!RB_Str_Case_Cmp (*parameter, "C")) extra_flags |= C_MODE; /* PetteriK */ else if (!RB_Str_Case_Cmp (*parameter, "SORT") || !RB_Str_Case_Cmp (*parameter, "-S")) course_of_action |= DO_SORT; else if (!RB_Str_Case_Cmp (*parameter, "INDEX")) { course_of_action |= DO_INDEX; course_of_action &= ~DO_MAKE_DOCUMENT; } else if (!RB_Str_Case_Cmp (*parameter, "INTERNAL") || !RB_Str_Case_Cmp (*parameter, "-I")) course_of_action |= DO_INCLUDE_INTERNAL; else if (!RB_Str_Case_Cmp (*parameter, "SINGLEDOC")) course_of_action |= DO_SINGLEDOC; else if (!RB_Str_Case_Cmp (*parameter, "NOSOURCE")) course_of_action |= DO_NOSOURCE; else if (!RB_Str_Case_Cmp (*parameter, "INTERNALONLY") || !RB_Str_Case_Cmp (*parameter, "-IO")) course_of_action |= DO_INTERNAL_ONLY; else if (!RB_Str_Case_Cmp (*parameter, "TOC") || !RB_Str_Case_Cmp (*parameter, "-T")) course_of_action |= DO_TOC; else if (!RB_Str_Case_Cmp (*parameter, "-V")) course_of_action |= DO_TELL; else if (!RB_Str_Case_Cmp (*parameter, "TITLE")) { if (--parameter_nr) { parameter++; document_title = *parameter; RB_Say ("TITLE=\"%s\"\n", *document_title); } else RB_Panic ("you must specify a title with the TITLE option\n"); } else if (!RB_Str_Case_Cmp (*parameter, "XREF") || !RB_Str_Case_Cmp (*parameter, "-X")) { if (--parameter_nr) { parameter++; *file_with_xrefs = *parameter; RB_Say ("XREF=\"%s\"\n", *file_with_xrefs); course_of_action |= DO_USE_XREFS; } else RB_Panic ("you must specify a xref file with the XREF option\n"); } else if (!RB_Str_Case_Cmp (*parameter, "TABSIZE") || !RB_Str_Case_Cmp (*parameter, "-TS")) { if (--parameter_nr) { parameter++; tab_size = atoi (*parameter); } else { RB_Panic ("you must specify the number of spaces with the" " TABSIZE option\n"); } } else if (!RB_Str_Case_Cmp (*parameter, "GENXREF") || !RB_Str_Case_Cmp (*parameter, "-G")) { if (--parameter_nr) { ++parameter; *output_file_for_xrefs = *parameter; RB_Say ("GENXREF=\"%s\"\n", *output_file_for_xrefs); course_of_action |= DO_MAKE_XREFS; course_of_action &= ~DO_MAKE_DOCUMENT; } else RB_Panic ("you must specify a xref file with the GENXREF option\n"); } else { RB_Panic ("unknown option %s\n", *parameter); } } if ((course_of_action & DO_USE_XREFS) && (output_mode == ASCII) && !(course_of_action & DO_INDEX)) { printf ("%s: WARNING, you can not use xrefs when you generate\n" "\t\tdocumentation in ASCII [discarding switch]\n", argv[0]); course_of_action &= ~DO_USE_XREFS; } if (course_of_action & DO_INDEX) { if ((output_mode != LATEX) && (output_mode != HTML)) { RB_Panic ("you can only use the INDEX option in combination with LATEX or HTML\n"); } } } /******/ /****i* ROBODoc/RB_Close_The_Shop [3.0b] * NAME * RB_Close_The_Shop -- free resources. * SYNOPSIS * void RB_Close_The_Shop () * FUNCTION * Frees all resources used by robodoc. * SEE ALSO * RB_Free_Header(), RB_Free_Link() * SOURCE */ void RB_Close_The_Shop (void) { struct RB_header *cur_header, *tmp_header; struct RB_link *cur_link, *tmp_link; if (source) fclose (source); if (documentation) fclose (documentation); if (xreffiles_file) fclose (xreffiles_file); if (xref_file) fclose (xref_file); for (cur_header = first_header; cur_header;) { tmp_header = cur_header->next_header; RB_Free_Header (cur_header); cur_header = tmp_header; } for (cur_link = first_link; cur_link;) { tmp_link = cur_link->next_link; RB_Free_Link (cur_link); cur_link = tmp_link; } if (header_index) free (header_index); if (link_index) free (link_index); } /******/