This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/wwlib/textfile.cpp

180 lines
5 KiB
C++
Raw Permalink Normal View History

/*
** 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;
}