mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-12-14 00:31:47 +08:00
210 lines
6.0 KiB
C++
210 lines
6.0 KiB
C++
|
/**********************************************************************
|
||
|
* File: strngs.c (Formerly strings.c)
|
||
|
* Description: STRING class functions.
|
||
|
* Author: Ray Smith
|
||
|
* Created: Fri Feb 15 09:13:30 GMT 1991
|
||
|
*
|
||
|
* (C) Copyright 1991, Hewlett-Packard Ltd.
|
||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
** you may not use this file except in compliance with the License.
|
||
|
** You may obtain a copy of the License at
|
||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||
|
** Unless required by applicable law or agreed to in writing, software
|
||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
** See the License for the specific language governing permissions and
|
||
|
** limitations under the License.
|
||
|
*
|
||
|
**********************************************************************/
|
||
|
|
||
|
#include "mfcpch.h" //precompiled headers
|
||
|
#include "tprintf.h"
|
||
|
#include "strngs.h"
|
||
|
|
||
|
/**********************************************************************
|
||
|
* STRING::operator=
|
||
|
*
|
||
|
* Assign a char* to a STRING.
|
||
|
**********************************************************************/
|
||
|
|
||
|
STRING & STRING::operator= ( //assign char*
|
||
|
const char *string //string to copy
|
||
|
) {
|
||
|
if (string != NULL) {
|
||
|
INT32
|
||
|
length = strlen (string) + 1;//length of source
|
||
|
|
||
|
if (ptr == NULL)
|
||
|
//get space
|
||
|
ptr = alloc_string (length);
|
||
|
//got wrong size
|
||
|
else if (strlen (ptr) != (UINT32) length - 1) {
|
||
|
free_string(ptr); //free old space
|
||
|
//get new space
|
||
|
ptr = alloc_string (length);
|
||
|
}
|
||
|
if (ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
return *this;
|
||
|
}
|
||
|
strcpy(ptr, string); //copy string
|
||
|
}
|
||
|
else {
|
||
|
if (ptr == NULL)
|
||
|
ptr = alloc_string (1); //get space
|
||
|
//got wrong size
|
||
|
else if (strlen (ptr) != 0) {
|
||
|
free_string(ptr); //free old space
|
||
|
ptr = alloc_string (1); //get new space
|
||
|
}
|
||
|
if (ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
return *this;
|
||
|
}
|
||
|
*ptr = '\0'; //copy string
|
||
|
}
|
||
|
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* STRING::operator+
|
||
|
*
|
||
|
* Concatenate 2 STRINGs.
|
||
|
**********************************************************************/
|
||
|
|
||
|
STRING
|
||
|
STRING::operator+ ( //concatenation
|
||
|
const STRING & string //second string
|
||
|
) const
|
||
|
{
|
||
|
INT32 length; //length of 1st op
|
||
|
STRING result; //concatenated string
|
||
|
|
||
|
if (ptr == NULL)
|
||
|
length = 0;
|
||
|
else
|
||
|
length = strlen (ptr);
|
||
|
result.ptr = alloc_string (length + strlen (string.ptr) + 1);
|
||
|
//total length
|
||
|
if (result.ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
return result;
|
||
|
}
|
||
|
result.ptr[0] = '\0';
|
||
|
if (ptr != NULL)
|
||
|
strcpy (result.ptr, ptr);
|
||
|
if (string.ptr != NULL)
|
||
|
//put together
|
||
|
strcpy (result.ptr + length, string.ptr);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* STRING::operator+
|
||
|
*
|
||
|
* Concatenate char to STRING.
|
||
|
**********************************************************************/
|
||
|
|
||
|
STRING
|
||
|
STRING::operator+ ( //concatenation
|
||
|
const char ch //char
|
||
|
) const
|
||
|
{
|
||
|
INT32 length; //length of 1st op
|
||
|
STRING result; //concatenated string
|
||
|
|
||
|
if (ptr == NULL)
|
||
|
length = 0;
|
||
|
else
|
||
|
length = strlen (ptr);
|
||
|
//total length
|
||
|
result.ptr = alloc_string (length + 2);
|
||
|
if (result.ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
return result;
|
||
|
}
|
||
|
if (ptr != NULL)
|
||
|
strcpy (result.ptr, ptr);
|
||
|
result.ptr[length] = ch; //put together
|
||
|
result.ptr[length + 1] = '\0';
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* STRING::operator+=
|
||
|
*
|
||
|
* Concatenate 2 strings putting the result straing back in the first
|
||
|
**********************************************************************/
|
||
|
|
||
|
STRING & STRING::operator+= ( //inplace cat
|
||
|
const char *string //string to add
|
||
|
) {
|
||
|
INT32
|
||
|
length; //length of 1st op
|
||
|
char *
|
||
|
src; //source string
|
||
|
|
||
|
if (string == NULL || string[0] == '\0')
|
||
|
return *this; //unchanged
|
||
|
if (ptr == NULL)
|
||
|
length = 0;
|
||
|
else
|
||
|
length = strlen (ptr); //length of 1st op
|
||
|
src = ptr; //temp copy
|
||
|
//new length
|
||
|
ptr = alloc_string (length + strlen (string) + 1);
|
||
|
if (ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
ptr = src;
|
||
|
return *this;
|
||
|
}
|
||
|
if (src != NULL) {
|
||
|
strcpy(ptr, src); //copy old
|
||
|
free_string(src); //free old one
|
||
|
}
|
||
|
strcpy (ptr + length, string); //add new
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**********************************************************************
|
||
|
* STRING::operatot+=
|
||
|
*
|
||
|
* Concatenate a char t a string putting the result straing back in the string
|
||
|
**********************************************************************/
|
||
|
|
||
|
STRING & STRING::operator+= ( //inplace cat
|
||
|
const char ch //char to add
|
||
|
) {
|
||
|
INT32
|
||
|
length; //length of 1st op
|
||
|
char *
|
||
|
src; //source string
|
||
|
|
||
|
if (ch == '\0')
|
||
|
return *this; //unchanged
|
||
|
if (ptr == NULL)
|
||
|
length = 0;
|
||
|
else
|
||
|
length = strlen (ptr); //length of 1st op
|
||
|
src = ptr; //temp copy
|
||
|
//new length
|
||
|
ptr = alloc_string (length + 2);
|
||
|
if (ptr == NULL) {
|
||
|
tprintf ("No memory to allocate string");
|
||
|
ptr = src;
|
||
|
return *this;
|
||
|
}
|
||
|
if (src != NULL) {
|
||
|
strcpy(ptr, src); //copy old
|
||
|
free_string(src); //free old one
|
||
|
}
|
||
|
ptr[length] = ch; //add new char
|
||
|
ptr[length + 1] = '\0';
|
||
|
return *this;
|
||
|
}
|