/* ** Command & Conquer Generals Zero Hour(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 . */ // // OLEString.cpp // #include "stdAfx.h" #include #include "olestring.h" template void StripSpaces ( OLECHAR *string); template void StripSpaces ( char *string ); template void StripSpacesFromMetaString ( OLECHAR *string ); template void StripSpacesFromMetaString ( char *string); template void ConvertMetaChars ( OLECHAR *string); template void ConvertMetaChars ( char *string); template int SameFormat ( char *string1, char *string2 ); template int SameFormat ( OLECHAR *string1, OLECHAR *string2 ); template void EncodeFormat ( char *string ); template void EncodeFormat ( OLECHAR *string ); template void DecodeFormat ( char *string1 ); template void DecodeFormat ( OLECHAR *string ); template int IsFormatTypeChar ( char string1 ); template int IsFormatTypeChar ( OLECHAR string ); static char *format_type = "cCdiouxXeEfgGnpsS"; // printf type as in %.{h|l|i64|L} template int IsFormatTypeChar ( text ch ) { char *ptr = format_type; while ( *ptr ) { if ( (unsigned int)*ptr++ == (unsigned int) ch ) { return TRUE; } } return FALSE; } OLEString::OLEString ( void ) { ole = NULL; sb = NULL; len = 0; Unlock (); Set (""); } OLEString::~OLEString ( ) { delete [] ole; delete [] sb; ole = NULL; sb = NULL; len = 0; } void OLEString::Set ( OLECHAR *new_ole ) { if ( !locked ) { delete [] ole; delete [] sb; ole = NULL; sb = NULL; len = wcslen ( new_ole ); { ole = new OLECHAR[len+1]; wcscpy ( ole, new_ole ); sb = new char[len+1]; sprintf ( sb, "%S", ole ); } } } void OLEString::Set ( char *new_sb ) { if ( !locked ) { delete [] ole; delete [] sb; ole = NULL; sb = NULL; len = strlen ( new_sb ); { ole = new OLECHAR[len+1]; swprintf ( ole, L"%S", new_sb ); sb = new char[len+1]; strcpy ( sb, new_sb ); } } } void OLEString::StripSpaces ( void ) { if ( locked ) { return; } if ( ole ) { ::StripSpaces ( ole ); } if ( sb ) { ::StripSpaces ( sb ); } } void OLEString::FormatMetaString ( void ) { char *str, *ptr; char ch, last = -1; int skipall = TRUE; int slash = FALSE; if ( !len || locked ) { return; } char *string = new char[len*2]; str = string; ptr = sb; while ( (ch = *ptr++) ) { if ( ch == ' ' ) { if ( last == ' ' ) { continue; } } skipall= FALSE; if ( ch == '\\' ) { char esc; slash = !slash; if ( slash && ((esc = *ptr) == 'n' || esc == 't') ) { // remove last space if ( last != ' ' ) { *str++ = ' '; } *str++ = '\\'; ptr++; *str++ = esc; last = *str++ = ' '; continue; } } else { slash = FALSE; } last = *str++ = ch; } if ( last == ' ' ) { str--; } *str = 0; Set ( string ); delete [] string; string = NULL; } template void StripSpaces ( text *string ) { text *str, *ptr; text ch, last = -1; int skipall = TRUE; str = ptr = string; while ( (ch = *ptr++) ) { if ( ch == ' ' ) { if ( last == ' ' || skipall ) { continue; } } if ( ch == '\n' || ch == '\t' ) { // remove last space if ( last == ' ' ) { str--; } skipall = TRUE; // skip all spaces last = *str++ = ch; continue; } last = *str++ = ch; skipall = FALSE; } if ( last == ' ' ) { str--; } *str = 0; } template void StripSpacesFromMetaString ( text *string ) { text *str, *ptr; text ch, last = -1; int skipall = TRUE; int slash = FALSE; str = ptr = string; while ( (ch = *ptr++) ) { if ( ch == ' ' ) { if ( last == ' ' || skipall ) { continue; } } skipall= FALSE; if ( ch == '\\' ) { text esc; slash = !slash; if ( slash && (esc = *ptr) == 'n' || esc == 't' ) { // remove last space if ( last == ' ' ) { str--; } skipall = TRUE; // skip all spaces *str++ = '\\'; ptr++; last = *str++ = esc; continue; } } else { slash = FALSE; } last = *str++ = ch; } if ( last == ' ' ) { str--; } *str = 0; } template void ConvertMetaChars ( text *string ) { text *ptr; text ch; ptr = string; while ( (ch = *string++) ) { if ( ch == '\\' ) { if ( ch = *string ) { switch ( ch ) { case 'n': case 'N': ch = '\n'; break; case 't': case 'T': ch = '\t'; break; } string++; } } *ptr++ = ch; } *ptr = 0; } template int SameFormat ( text *string1, text *string2 ) { while ( *string1 && *string2 ) { while ( *string1 ) { if (*string1 == '%') { string1++; break; } if ( *string1 == '\\' ) { string1++; } if ( *string1 ) { string1++; } } while ( *string2 ) { if (*string2 == '%') { string2++; break; } if ( *string2 == '\\' ) { string2++; } if ( *string2) { string2++; } } if ( !*string1 && !*string2) { return TRUE; } int found_type = FALSE; while ( *string1 && *string2 && !found_type ) { found_type = IsFormatTypeChar ( *string1 ); if ( *string1 != *string2 ) { return FALSE; } string1++; string2++; } } return TRUE; } template void EncodeFormat ( text *string ) { } template void DecodeFormat ( text *string ) { }