home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Atomic_Tanks / Atomic-Tanks-5.1.exe / src / text.cpp < prev    next >
C/C++ Source or Header  |  2010-02-18  |  5KB  |  228 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "text.h"
  5.  
  6.  
  7. // Basic constructor to kick things off
  8. TEXTBLOCK::TEXTBLOCK()
  9. {
  10.     complete_text = NULL;
  11.     total_lines = current_line = 0;
  12. }
  13.  
  14.  
  15. // A constructor that also loads text from a file
  16. TEXTBLOCK::TEXTBLOCK(char *filename)
  17. {
  18.     int status;
  19.  
  20.     complete_text = NULL;
  21.     total_lines = current_line = 0;
  22.     if (filename)
  23.     {
  24.         status = Load_File(filename);
  25.         if (! status)
  26.           printf("Something went wrong loading text from file: %s\n", filename);
  27.     }
  28. }
  29.  
  30.  
  31. // clean everything
  32. TEXTBLOCK::~TEXTBLOCK()
  33. {
  34.    int count;
  35.  
  36.    if (complete_text)
  37.    {
  38.      for (count = 0; count < total_lines; count++)
  39.      {
  40.         if ( complete_text[count] )
  41.            free(complete_text[count]);
  42.      }
  43.      free(complete_text);
  44.    }
  45.  
  46. }
  47.  
  48.  
  49.  
  50.  
  51. void TEXTBLOCK::Trim_Newline(char *line)
  52. {
  53.     int index = 0;
  54.  
  55.     while ( line[index] )
  56.     {
  57.        if ( (line[index] == '\n') || (line[index] == '\r') )
  58.           line[index] = '\0';
  59.        else
  60.           index++;
  61.     }
  62. }
  63.  
  64.  
  65.  
  66. // This function does most of the work. It loads an entire text
  67. // file into memory. Returns TRUE on success or FALSE if
  68. // somethign goes wrong.
  69. int TEXTBLOCK::Load_File(char *filename)
  70. {
  71.     FILE *phile;
  72.     int lines_loaded = 0;
  73.     int we_have_space = 10;
  74.     char line[MAX_LINE_LENGTH], *status;
  75.  
  76.     // open the file
  77.     phile = fopen(filename, "r");
  78.     if (! phile)
  79.       return FALSE;
  80.  
  81.     // give us some space  
  82.     complete_text = (char **) calloc(we_have_space, sizeof(char *));
  83.     if (! complete_text)
  84.     {
  85.        fclose(phile);
  86.        return FALSE;
  87.     }
  88.  
  89.     // time to load some text!
  90.     status = fgets(line, MAX_LINE_LENGTH, phile);
  91.     while ( (status) && (lines_loaded < MAX_LINES_IN_FILE) && (complete_text)  )
  92.     {
  93.         Trim_Newline(line);
  94.         complete_text[lines_loaded] = (char *) calloc( strlen(line) + 1, sizeof(char));
  95.         if ( complete_text[lines_loaded] )
  96.         {
  97.              strcpy( complete_text[lines_loaded], line );
  98.              lines_loaded++;
  99.         }
  100.         if (lines_loaded >= we_have_space)
  101.         {
  102.             we_have_space += 10;
  103.             complete_text = (char **) realloc( complete_text, we_have_space * sizeof(char *) );
  104.         }
  105.         status = fgets(line, MAX_LINE_LENGTH, phile);
  106.     }       // all done loading
  107.  
  108.     if (complete_text)
  109.        complete_text = (char **) realloc( complete_text, lines_loaded * sizeof(char *) );
  110.     fclose(phile);
  111.     total_lines = lines_loaded;
  112.     current_line = 0;
  113.     return TRUE;
  114. }
  115.  
  116.  
  117.  
  118. // Find a random line and return it
  119. char *TEXTBLOCK::Get_Random_Line()
  120. {
  121.     int my_line;
  122.     char *my_text;
  123.  
  124.     my_line = rand() % total_lines;
  125.     my_text = complete_text[my_line];
  126.     return my_text;
  127. }
  128.  
  129.  
  130. // Returns the current line
  131. char *TEXTBLOCK::Get_Current_Line()
  132. {
  133.    char *my_text;
  134.  
  135.    my_text = complete_text[current_line];
  136.    return my_text;
  137. }
  138.  
  139.  
  140.  
  141.  
  142. // Move the line counter ahead, if possible
  143. // Returns FALSE if we hit the end of lines, or
  144. // true if everything is OK
  145. int TEXTBLOCK::Next_Line()
  146. {
  147.     current_line++;
  148.     if (current_line >= total_lines)
  149.     {
  150.         current_line = total_lines - 1;
  151.         return FALSE;
  152.     }
  153.     return TRUE;
  154. }
  155.  
  156.  
  157.  
  158. // Go to the previous line. The function returns
  159. // TRUE is everything is OK. If we were already
  160. // at the beginning, then FALSE is returned.
  161. int TEXTBLOCK::Previous_Line()
  162. {
  163.     if (current_line > 0)
  164.     {
  165.          current_line--;
  166.          return TRUE;
  167.     }
  168.     return FALSE;
  169. }
  170.  
  171.  
  172. // This function display all lines of text. Optionally, it
  173. // will also print line numbers before each line.
  174. // The number of lines printed is returned.
  175. int TEXTBLOCK::Display_All(int line_numbers)
  176. {
  177.     int counter = 0;
  178.  
  179.     while (counter < total_lines)
  180.     {
  181.         if (line_numbers)
  182.            printf("%d. ", counter);
  183.         printf("%s\n", complete_text[counter]);
  184.         counter++;
  185.     }
  186.     return counter;
  187. }
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195. // This is a free floating function
  196. char *Add_Comma(int number)
  197. {
  198.     char buffer[64];
  199.     static char return_value[128];
  200.     int index, return_index;
  201.     int place_counter = 0;
  202.  
  203.     // we won't worry about over-flow with such a big buffer
  204.     sprintf(buffer, "%d", number);
  205.     memset(return_value, '\0', 128);
  206.     index = strlen(buffer);      // start from the end
  207.     return_index = index + (index / 3);
  208.     return_index -= 1;
  209.     if (! (index % 3) )
  210.        return_index--;
  211.     index -= 1;
  212.     while (index >= 0)
  213.     {
  214.         return_value[return_index] = buffer[index];
  215.         return_index--;
  216.         index--;
  217.         place_counter++;
  218.         if ( (place_counter == 3) && (return_index > 0) )
  219.         {
  220.             place_counter = 0;
  221.             return_value[return_index] = ',';
  222.             return_index--;
  223.         }
  224.     }
  225.     return return_value;
  226. }
  227.  
  228.