# include # include # include # include # include # include using namespace std; int main ( int argc, char *argv[] ); char ch_cap ( char c ); int ch_index_first ( string s, char c ); int get_file_type ( string file_name ); void handle_c ( string file_name, string s1, string s2 ); void handle_cc ( string file_name, string s1, string s2 ); void handle_f77 ( string file_name, string s1, string s2 ); void handle_f90 ( string file_name, string s1, string s2 ); void handle_m ( string file_name, string s1, string s2 ); int i4_min ( int i1, int i2 ); bool s_begin ( string s1, string s2 ); string s_cap ( string s ); string s_last_ch ( string s, char ch ); void timestamp ( ); // // GLOBAL DATA // char date_string[30]; //****************************************************************************80 int main ( int argc, char *argv[] ) //****************************************************************************80 // // Purpose: // // MAIN is the main program for HTMLINDEX. // // Discussion: // // HTMLINDEX makes a skeleton HTML page from a marked up source code file. // // HTMLINDEX writes a skeleton HTML page to standard output, including // stubs for the software name, description, copying option, an // unnumbered list of the double exclamation lines (typically reporting // the routines contained in the program), and some clean up lines // at the end. // // In my FORTRAN files, each function and subroutine includes a single // line that lists its name and purpose. This line always has the form: // // !! NAME purpose // // and HTMLINDEX makes an HTML page suitable for describing the file, // including a list of functions and subroutines compiled from these // lines. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Usage: // // htmlindex program.f90 > program.html // { int C = 1; int CC = 2; int F77 = 3; int F90 = 4; string file_name; int file_type; string head; string head_cap; int i; char* ipoint; int j; int M = 5; time_t seconds; struct tm *time_struct; int UNKNOWN = -1; bool VERBOSE = false; if ( VERBOSE ) { timestamp ( ); cout << "\n"; cout << "HTMLINDEX:\n"; cout << " C++ version\n"; cout << "\n"; cout << " Compiled on " << __DATE__ << " at " << __TIME__ << ".\n"; cout << "\n"; cout << " Produce a skeleton HTML page for a marked up file.\n"; } // // Retrieve the date. // (This was surprisingly unpleasant!) // time ( &seconds ); time_struct = localtime ( &seconds ); ipoint = asctime ( time_struct ); strcpy ( date_string, ipoint ); // // If the input file was not specified, get it now. // if ( argc <= 1 ) { cout << "\n"; cout << "HTLMINDEX:\n"; cout << " Please enter the name of a file to be indexed.\n"; cin >> file_name; j = ch_index_first ( file_name, '.' ); head = file_name.substr ( 0, j ); head_cap = s_cap ( head ); file_type = get_file_type ( file_name ); if ( file_type == C ) { handle_c ( file_name, head, head_cap ); } else if ( file_type == CC ) { handle_cc ( file_name, head, head_cap ); } else if ( file_type == F77 ) { handle_f77 ( file_name, head, head_cap ); } else if ( file_type == F90 ) { handle_f90 ( file_name, head, head_cap ); } else if ( file_type == M ) { handle_m ( file_name, head, head_cap ); } else if ( file_type == UNKNOWN ) { cerr << "\n"; cerr << "HTMLINDEXINDEX - Error!\n" ; cerr << " The file type of \"" << file_name << "\" could not be determined.\n"; } } // // Otherwise, open each target file, split it and close it. // else { for ( i = 1; i < argc; i++ ) { file_name = argv[i]; j = ch_index_first ( file_name, '.' ); head = file_name.substr ( 0, j ); head_cap = s_cap ( head ); file_type = get_file_type ( file_name ); if ( file_type == C ) { handle_c ( file_name, head, head_cap ); } else if ( file_type == CC ) { handle_cc ( file_name, head, head_cap ); } else if ( file_type == F77 ) { handle_f77 ( file_name, head, head_cap ); } else if ( file_type == F90 ) { handle_f90 ( file_name, head, head_cap ); } else if ( file_type == M ) { handle_m ( file_name, head, head_cap ); } else if ( file_type == UNKNOWN ) { cerr << "\n"; cerr << "HTMLINDEX - Error!\n" ; cerr << " The file type of \"" << file_name << "\" could not be determined.\n"; } } } // // Terminate. // if ( VERBOSE ) { cout << "\n"; cout << "HTMLINDEX:\n"; cout << " Normal end of execution.\n"; cout << "\n"; timestamp ( ) ; } return 0; } //****************************************************************************80 char ch_cap ( char c ) //****************************************************************************80 // // Purpose: // // CH_CAP capitalizes a single character. // // Discussion: // // This routine should be equivalent to the library "toupper" function. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 19 July 1998 // // Author: // // John Burkardt // // Parameters: // // Input, char C, the character to capitalize. // // Output, char CH_CAP, the capitalized character. // { if ( 97 <= c && c <= 122 ) { c = c - 32; } return c; } //****************************************************************************80 int ch_index_first ( string s, char c ) //****************************************************************************80 // // Purpose: // // CH_INDEX_FIRST finds the first occurrence of a character in a string. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string S, a string to be searched. // // Input, char C, the character to be searched for. // // Output, int CH_INDEX_FIRST, the index of the first occurrence // of the character, or -1 if it does not occur. // { int i; int nchar; nchar = s.length ( ); for ( i = 0; i < nchar; i++ ) { if ( s[i] == c ) { return i; } } return -1; } //****************************************************************************80 int get_file_type ( string file_name ) //****************************************************************************80 // // Purpose: // // GET_FILE_TYPE determines the type of a file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file. // // Output, int FILE_TYPE, is C, CC, F, or UNKNOWN. // { int C = 1; int CC = 2; string ext; int F77 = 3; int F90 = 4; int file_type; int M = 5; int UNKNOWN = -1; ext = s_last_ch ( file_name, '.' ); if ( ext.empty ( ) ) { file_type = UNKNOWN; } else if ( ext.compare ( ".f" ) == 0 ) { file_type = F77; } else if ( ext.compare ( ".f77" ) == 0 ) { file_type = F77; } else if ( ext.compare ( ".f90" ) == 0 ) { file_type = F90; } else if ( ext.compare ( ".f95" ) == 0 ) { file_type = F90; } else if ( ext.compare ( ".for" ) == 0 ) { file_type = F77; } else if ( ext.compare ( ".c" ) == 0 ) { file_type = C; } else if ( ext.compare ( ".cc" ) == 0 ) { file_type = CC; } else if ( ext.compare ( ".C" ) == 0 ) { file_type = CC; } else if ( ext.compare ( ".cxx" ) == 0 ) { file_type = CC; } else if ( ext.compare ( ".cpp" ) == 0 ) { file_type = CC; } else if ( ext.compare ( ".m" ) == 0 ) { file_type = M; } else { file_type = UNKNOWN; } return file_type; } //****************************************************************************80 void handle_c ( string file_name, string s1, string s2 ) //****************************************************************************80 // // Purpose: // // HANDLE_C processes a single C file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file to be processed. // // Input, string S1, the name of the file, minus extension. // // Input, string S2, the same as S1, but capitalized. // { ifstream file_in; int i0 = 0; int i1 = 0; int i2 = 0; string line; int line_length; int inc; // // Open the file. // file_in.open ( file_name.c_str ( ) ); if ( !file_in ) { cerr << "\n"; cerr << "HANDLE_C - Fatal error!\n"; cerr << " Cannot open \"" << file_name << "\".\n"; return; } // // Write the header. // cout << "\n"; cout << "\n"; cout << " \n"; cout << " \n"; cout << " "; cout << s2; cout << " - title goes here.\n"; cout << " \n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "

\n"; cout << " "; cout << s2; cout << "
heading goes here.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << "\n"; cout << " is a C (program/library) which\n"; cout << " (description goes here).\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Usage:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Licensing:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " The computer code and data files made available on this\n"; cout << " web page are distributed under\n"; cout << " the GNU LGPL license.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Languages:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << " is available in\n"; cout << " a C version.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Related Data and Programs:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Reference:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; cout << "
  1. \n"; cout << " \n"; cout << "
  2. \n"; cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Source Code:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Examples and Tests:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; // // Start the HTML Paragraph, and "Unnumbered List". // cout << "

\n"; cout << " List of Routines:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; // // Get another line of text. // while ( 1 ) { getline ( file_in, line ); line_length = line.length ( ); if ( file_in.eof ( ) ) { break; } i0 = i1; i1 = i2; // // If we find the marker, then the text we want is two lines later. // if ( s_begin ( line, " Purpose:" ) ) { i2 = 1; } else { i2 = 0; } if ( i0 == 1 ) { // // Begin the HTML List Item, and go into Bold face. // cout << "
  • \n"; cout << " "; // // Print out all the characters, until you see a space. // inc = 4; while ( line[inc] != ' ' && line[inc] && inc < line_length ) { cout << line[inc]; inc = inc + 1; } // // Terminate Bold face, then print the rest of the characters, // and end the List Item. // cout << ""; while ( inc < line_length ) { cout << line[inc]; inc = inc + 1; } cout << "\n"; cout << "
  • \n"; } } // // End the HTML "Unnumbered List" and Paragraph. // cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " You can go up one level to \n"; cout << " the C source codes.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << " \n"; cout << " Last revised on " << date_string; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "\n"; // // Close the file. // file_in.close ( ); return; } //****************************************************************************80 void handle_cc ( string file_name, string s1, string s2 ) //****************************************************************************80 // // Purpose: // // HANDLE_CC processes a single C++ file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file to be processed. // // Input, string S1, the name of the file, minus extension. // // Input, string S2, the same as S1, but capitalized. // { ifstream file_in; int i0 = 0; int i1 = 0; int i2 = 0; string line; int line_length; int inc; // // Open the file. // file_in.open ( file_name.c_str ( ) ); if ( !file_in ) { cerr << "\n"; cerr << "HANDLE_CC - Fatal error!\n"; cerr << " Cannot open \"" << file_name << "\".\n"; return; } // // Write the header. // cout << "\n"; cout << "\n"; cout << " \n"; cout << " \n"; cout << " "; cout << s2; cout << " - title goes here.\n"; cout << " \n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "

\n"; cout << " "; cout << s2; cout << "
heading goes here.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << "\n"; cout << " is a C++ (program/library) which\n"; cout << " (description goes here).\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Usage:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Licensing:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " The computer code and data files made available on this\n"; cout << " web page are distributed under\n"; cout << " the GNU LGPL license.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Languages:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << " is available in\n"; cout << " a C++ version.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Related Data and Programs:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Reference:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; cout << "
  1. \n"; cout << " \n"; cout << "
  2. \n"; cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Source Code:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Examples and Tests:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; // // Start the HTML Paragraph, and "Unnumbered List". // cout << "

\n"; cout << " List of Routines:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; // // Get another line of text. // while ( 1 ) { getline ( file_in, line ); line_length = line.length ( ); if ( file_in.eof ( ) ) { break; } i0 = i1; i1 = i2; // // If we find the marker, then the text we want is two lines later. // if ( s_begin ( line, "// Purpose:" ) ) { i2 = 1; } else { i2 = 0; } if ( i0 == 1 ) { // // Begin the HTML List Item, and go into Bold face. // cout << "
  • \n"; cout << " "; // // Print out all the characters, until you see a space. // inc = 6; while ( line[inc] != ' ' && line[inc] && inc < line_length ) { cout << line[inc]; inc = inc + 1; } // // Terminate Bold face, then print the rest of the characters, // and end the List Item. // cout << ""; while ( inc < line_length ) { cout << line[inc]; inc = inc + 1; } cout << "\n"; cout << "
  • \n"; } } // // End the HTML "Unnumbered List" and Paragraph. // cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " You can go up one level to \n"; cout << " the C++ source codes.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << " \n"; cout << " Last revised on " << date_string; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "\n"; // // Close the file. // file_in.close ( ); return; } //****************************************************************************80 void handle_f77 ( string file_name, string s1, string s2 ) //****************************************************************************80 // // Purpose: // // HANDLE_F77 processes a single FORTRAN77 file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file to be processed. // // Input, string S1, the name of the file, minus extension. // // Input, string S2, the same as S1, but capitalized. // { ifstream file_in; string line; int line_length; int inc; // // Open the file. // file_in.open ( file_name.c_str ( ) ); if ( !file_in ) { cerr << "\n"; cerr << "HANDLE_F77 - Fatal error!\n"; cerr << " Cannot open \"" << file_name << "\".\n"; return; } // // Write the header. // cout << "\n"; cout << "\n"; cout << " \n"; cout << " \n"; cout << " " << s2 << " - title goes here.\n"; cout << " \n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "

\n"; cout << " "; cout << s2; cout << "
heading goes here.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << "\n"; cout << " is a FORTRAN77 (program/library) which\n"; cout << " (description goes here).\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Usage:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Licensing:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " The computer code and data files made available on this\n"; cout << " web page are distributed under\n"; cout << " the GNU LGPL license.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Languages:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << " is available in\n"; cout << " a FORTRAN77 version.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Related Data and Programs:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Reference:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; cout << "
  1. \n"; cout << " \n"; cout << "
  2. \n"; cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Source Code:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Examples and Tests:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; // // Start the HTML Paragraph, and "Unnumbered List". // cout << "

\n"; cout << " List of Routines:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; // // Get another line of text. // while ( 1 ) { getline ( file_in, line ); line_length = line.length ( ); if ( file_in.eof ( ) ) { break; } // // If the text begins with "!!" then we want to print it, // but skipping the first three characters. // if ( s_begin ( line, "!!" ) || s_begin ( line, "cc" ) || s_begin ( line, "CC" ) ) { // // Begin the HTML List Item, and go into Bold face. // cout << "
  • \n"; cout << " "; // // Print out all the characters, until you see a space. // inc = 3; while ( line[inc] != ' ' && line[inc] && inc < line_length ) { cout << line[inc]; inc = inc + 1; } // // Terminate Bold face, then print the rest of the characters, // and end the List Item. // cout << ""; while ( inc < line_length ) { cout << line[inc]; inc = inc + 1; } cout << "\n"; cout << "
  • \n"; } } // // End the HTML "Unnumbered List" and Paragraph. // cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " You can go up one level to \n"; cout << " the FORTRAN77 source codes.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << " \n"; cout << " Last revised on " << date_string; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "\n"; // // Close the file. // file_in.close ( ); return; } //****************************************************************************80 void handle_f90 ( string file_name, string s1, string s2 ) //****************************************************************************80 // // Purpose: // // HANDLE_F90 processes a single FORTRAN90 file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file to be processed. // // Input, string S1, the name of the file, minus extension. // // Input, string S2, the same as S1, but capitalized. // { ifstream file_in; string line; int line_length; int inc; // // Open the file. // file_in.open ( file_name.c_str ( ) ); if ( !file_in ) { cerr << "\n"; cerr << "HANDLE_F90 - Fatal error!\n"; cerr << " Cannot open \"" << file_name << "\".\n"; return; } // // Write the header. // cout << "\n"; cout << "\n"; cout << " \n"; cout << " \n"; cout << " " << s2 << " - title goes here.\n"; cout << " \n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "

\n"; cout << " "; cout << s2; cout << "
heading goes here.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << "\n"; cout << " is a FORTRAN90 (program/library) which\n"; cout << " (description goes here).\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Usage:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Licensing:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " The computer code and data files made available on this\n"; cout << " web page are distributed under\n"; cout << " the GNU LGPL license.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Languages:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << " is available in\n"; cout << " a FORTRAN90 version.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Related Data and Programs:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Reference:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; cout << "
  1. \n"; cout << " \n"; cout << "
  2. \n"; cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Source Code:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Examples and Tests:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; // // Start the HTML Paragraph, and "Unnumbered List". // cout << "

\n"; cout << " List of Routines:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; // // Get another line of text. // while ( 1 ) { getline ( file_in, line ); line_length = line.length ( ); if ( file_in.eof ( ) ) { break; } // // If the text begins with "!!" then we want to print it, // but skipping the first three characters. // if ( s_begin ( line, "!!" ) || s_begin ( line, "cc" ) || s_begin ( line, "CC" ) ) { // // Begin the HTML List Item, and go into Bold face. // cout << "
  • \n"; cout << " "; // // Print out all the characters, until you see a space. // inc = 3; while ( line[inc] != ' ' && line[inc] && inc < line_length ) { cout << line[inc]; inc = inc + 1; } // // Terminate Bold face, then print the rest of the characters, // and end the List Item. // cout << ""; while ( inc < line_length ) { cout << line[inc]; inc = inc + 1; } cout << "\n"; cout << "
  • \n"; } } // // End the HTML "Unnumbered List" and Paragraph. // cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " You can go up one level to \n"; cout << " the FORTRAN90 source codes.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << " \n"; cout << " Last revised on " << date_string; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "\n"; // // Close the file. // file_in.close ( ); return; } //****************************************************************************80 void handle_m ( string file_name, string s1, string s2 ) //****************************************************************************80 // // Purpose: // // HANDLE_M processes a single MATLAB file. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 13 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string FILE_NAME, the name of the file to be processed. // // Input, string S1, the name of the file, minus extension. // // Input, string S2, the same as S1, but capitalized. // { ifstream file_in; string line; int line_length; int inc; // // Open the file. // file_in.open ( file_name.c_str ( ) ); if ( !file_in ) { cerr << "\n"; cerr << "HANDLE_M - Fatal error!\n"; cerr << " Cannot open \"" << file_name << "\".\n"; return; } // // Write the header. // cout << "\n"; cout << "\n"; cout << " \n"; cout << " \n"; cout << " " << s2 << " - title goes here.\n"; cout << " \n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "

\n"; cout << " "; cout << s2; cout << "
heading goes here.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << "\n"; cout << " is a MATLAB (program/library) which\n"; cout << " (description goes here).\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Usage:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Licensing:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " The computer code and data files made available on this\n"; cout << " web page are distributed under\n"; cout << " the GNU LGPL license.\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Languages:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " " << s2 << " is available in\n"; cout << " a Matlab version.\n"; cout << "\n"; cout << "

\n"; cout << " Related Data and Programs:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Reference:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; cout << "
  1. \n"; cout << " \n"; cout << "
  2. \n"; cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Source Code:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " Examples and Tests:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

\n"; cout << "

\n"; cout << "\n"; // // Start the HTML Paragraph, and "Unnumbered List". // cout << "

\n"; cout << " List of Routines:\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << "

    \n"; // // Get another line of text. // while ( 1 ) { getline ( file_in, line ); line_length = line.length ( ); if ( file_in.eof ( ) ) { break; } // // If the text begins with "%%" then we want to print it, // but skipping the first three characters. // if ( s_begin ( line, "%%" ) ) { // // Begin the HTML List Item, and go into Bold face. // cout << "
  • \n"; cout << " "; // // Print out all the characters, until you see a space. // inc = 3; while ( line[inc] != ' ' && line[inc] && inc < line_length ) { cout << line[inc]; inc = inc + 1; } // // Terminate Bold face, then print the rest of the characters, // and end the List Item. // cout << ""; while ( inc < line_length ) { cout << line[inc]; inc = inc + 1; } cout << "\n"; cout << "
  • \n"; } } // // End the HTML "Unnumbered List" and Paragraph. // cout << "
\n"; cout << "

\n"; cout << "\n"; cout << "

\n"; cout << " You can go up one level to \n"; cout << " the MATLAB source codes.\n"; cout << "

\n"; cout << "\n"; cout << "
\n"; cout << "\n"; cout << " \n"; cout << " Last revised on " << date_string; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << " \n"; cout << "\n"; cout << "\n"; // // Close the file. // file_in.close ( ); return; } //****************************************************************************80 int i4_min ( int i1, int i2 ) //****************************************************************************80 // // Purpose: // // I4_MIN returns the minimum of two I4's. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 13 October 1998 // // Author: // // John Burkardt // // Parameters: // // Input, int I1, I2, two integers to be compared. // // Output, int I4_MIN, the smaller of I1 and I2. // { int value; if ( i1 < i2 ) { value = i1; } else { value = i2; } return value; } //****************************************************************************80 bool s_begin ( string s1, string s2 ) //****************************************************************************80 // // Purpose: // // S_BEGIN reports whether string 1 begins with string 2. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 September 2010 // // Author: // // John Burkardt // // Parameters: // // Input, string S1, string S2, two strings. // // Output, bool S_BEGIN, is true if S1 is the same as S2 up to // the end of S2, and false otherwise. // { int i; int n1; int n2; n1 = s1.length ( ); n2 = s2.length ( ); if ( n1 < n2 ) { return false; } for ( i = 0; i < n2; i++ ) { if ( s1[i] != s2[i] ) { return false; } } return true; } //****************************************************************************80 string s_cap ( string s ) //****************************************************************************80 // // Purpose: // // S_CAP capitalizes all the characters in a string. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 29 August 2009 // // Author: // // John Burkardt // // Parameters: // // Input, string S, the string to be capitalized. // // Output, string S_CAP, the capitalized string. // { int i; int s_length; string s2; s_length = s.length ( ); s2 = s; for ( i = 0; i < s_length; i++ ) { s2[i] = ch_cap ( s2[i] ); } return s2; } //****************************************************************************80 string s_last_ch ( string s, char ch ) //****************************************************************************80 // // Purpose: // // S_LAST_CH points to the last occurrence of a character in a string. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 06 January 2003 // // Author: // // John Burkardt // // Parameters: // // Input, string S, a string. // // Input, char CH, a character. // // Output, string S_LAST_CH, the substring beginning with the last occurrence // of the given character. // { int position; int s_length; string t; int t_length; s_length = s.length ( ); // // Find the last occurrence. // for ( position = s_length - 1; 0 <= position; position-- ) { if ( s[position] == ch ) { t_length = s_length - position; t = s.substr ( position, t_length ); return t; } } t.clear ( ); return t; } //****************************************************************************80 void timestamp ( ) //****************************************************************************80 // // Purpose: // // TIMESTAMP prints the current YMDHMS date as a time stamp. // // Example: // // May 31 2001 09:45:54 AM // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 02 October 2003 // // Author: // // John Burkardt // // Parameters: // // None // { # define TIME_SIZE 40 static char time_buffer[TIME_SIZE]; const struct tm *tm; size_t len; time_t now; now = time ( NULL ); tm = localtime ( &now ); len = strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm ); cout << time_buffer << "\n"; return; # undef TIME_SIZE }