mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-16 15:41:39 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
179
Code/wwlib/textfile.cpp
Normal file
179
Code/wwlib/textfile.cpp
Normal file
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
** 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;
|
||||
}
|
||||
Reference in New Issue
Block a user