180 lines
5 KiB
C++
180 lines
5 KiB
C++
|
/*
|
||
|
** Command & Conquer Renegade(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** 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 <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||
|
***********************************************************************************************
|
||
|
* *
|
||
|
* Project Name : Command & Conquer *
|
||
|
* *
|
||
|
* $Archive:: /Commando/Code/wwlib/textfile.cpp $*
|
||
|
* *
|
||
|
* $Author:: Patrick $*
|
||
|
* *
|
||
|
* $Modtime:: 7/26/01 9:37p $*
|
||
|
* *
|
||
|
* $Revision:: 4 $*
|
||
|
* *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#include "textfile.h"
|
||
|
#include "wwstring.h"
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// TextFileClass
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
TextFileClass::TextFileClass (void)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// TextFileClass
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
TextFileClass::TextFileClass (char const *filename)
|
||
|
: RawFileClass (filename)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// ~TextFileClass
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
TextFileClass::~TextFileClass (void)
|
||
|
{
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Read_Line
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
bool
|
||
|
TextFileClass::Read_Line (StringClass &string)
|
||
|
{
|
||
|
//
|
||
|
// Start with a fresh string
|
||
|
//
|
||
|
// string.Empty ();
|
||
|
string="";
|
||
|
|
||
|
const int BUFFER_SIZE = 64;
|
||
|
char buffer[BUFFER_SIZE] = { 0 };
|
||
|
bool keep_going = true;
|
||
|
|
||
|
while (keep_going) {
|
||
|
|
||
|
//
|
||
|
// Read a chunk of characters from the file
|
||
|
//
|
||
|
int size = Read (buffer, BUFFER_SIZE - 1);
|
||
|
|
||
|
//
|
||
|
// Keep going if we still have more data to
|
||
|
// read from the file
|
||
|
//
|
||
|
keep_going = (size == BUFFER_SIZE - 1);
|
||
|
if (size > 0) {
|
||
|
|
||
|
//
|
||
|
// Try to find the linefeed character
|
||
|
//
|
||
|
for (int index = 0; index < size; index ++) {
|
||
|
if (buffer[index] == '\n') {
|
||
|
|
||
|
//
|
||
|
// Terminate the buffer after the linefeed
|
||
|
//
|
||
|
buffer[index + 1] = 0;
|
||
|
|
||
|
//
|
||
|
// Seek backwards in the file to the position
|
||
|
// directly after the linefeed
|
||
|
//
|
||
|
Seek (-(size - (index + 1)), SEEK_CUR);
|
||
|
keep_going = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Concat this buffer to the end of the string
|
||
|
//
|
||
|
string += buffer;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool retval = (string.Get_Length () > 0);
|
||
|
if (retval) {
|
||
|
|
||
|
int len = string.Get_Length ();
|
||
|
char *raw_string = string.Peek_Buffer ();
|
||
|
|
||
|
//
|
||
|
// Strip the CR\LF or LF from the string
|
||
|
//
|
||
|
if (len > 1 && raw_string[len - 2] == '\r') {
|
||
|
string.Erase (len - 2, 2);
|
||
|
//raw_string[len - 2] = 0;
|
||
|
} else if (raw_string[len - 1] == '\n') {
|
||
|
string.Erase (len - 1, 1);
|
||
|
//raw_string[len - 1] = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Write_Line
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
bool
|
||
|
TextFileClass::Write_Line (const StringClass &string)
|
||
|
{
|
||
|
bool retval = false;
|
||
|
|
||
|
//
|
||
|
// Write the line of text out to the file
|
||
|
//
|
||
|
int len = string.Get_Length ();
|
||
|
int size = Write ((const char *)string, len);
|
||
|
|
||
|
//
|
||
|
// Now append a CR\LF pair to the end of the line
|
||
|
//
|
||
|
if (size == len) {
|
||
|
retval = (Write ("\r\n", 2) == 2);
|
||
|
}
|
||
|
|
||
|
return retval;
|
||
|
}
|