/src/gdal/frmts/pcidsk/sdk/segment/cpcidsk_tex.cpp
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Purpose: Implementation of the CPCIDSK_TEX class. |
4 | | * |
5 | | ****************************************************************************** |
6 | | * Copyright (c) 2010 |
7 | | * PCI Geomatics, 90 Allstate Parkway, Markham, Ontario, Canada. |
8 | | * |
9 | | * SPDX-License-Identifier: MIT |
10 | | ****************************************************************************/ |
11 | | |
12 | | #include "pcidsk_exception.h" |
13 | | #include "segment/cpcidsk_tex.h" |
14 | | #include <cassert> |
15 | | #include <cstring> |
16 | | |
17 | | using namespace PCIDSK; |
18 | | |
19 | 0 | PCIDSK_TEX::~PCIDSK_TEX() = default; |
20 | | |
21 | | /************************************************************************/ |
22 | | /* CPCIDSK_TEX() */ |
23 | | /************************************************************************/ |
24 | | |
25 | | CPCIDSK_TEX::CPCIDSK_TEX( PCIDSKFile *fileIn, int segmentIn, |
26 | | const char *segment_pointer ) |
27 | 0 | : CPCIDSKSegment( fileIn, segmentIn, segment_pointer ) |
28 | | |
29 | 0 | { |
30 | 0 | } Unexecuted instantiation: PCIDSK::CPCIDSK_TEX::CPCIDSK_TEX(PCIDSK::PCIDSKFile*, int, char const*) Unexecuted instantiation: PCIDSK::CPCIDSK_TEX::CPCIDSK_TEX(PCIDSK::PCIDSKFile*, int, char const*) |
31 | | |
32 | | /************************************************************************/ |
33 | | /* ~CPCIDSK_TEX() */ |
34 | | /************************************************************************/ |
35 | | |
36 | | CPCIDSK_TEX::~CPCIDSK_TEX() |
37 | | |
38 | 0 | { |
39 | 0 | } |
40 | | |
41 | | /************************************************************************/ |
42 | | /* ReadText() */ |
43 | | /************************************************************************/ |
44 | | |
45 | | std::string CPCIDSK_TEX::ReadText() |
46 | | |
47 | 0 | { |
48 | 0 | PCIDSKBuffer seg_data; |
49 | |
|
50 | 0 | seg_data.SetSize( (int) GetContentSize() ); |
51 | |
|
52 | 0 | ReadFromFile( seg_data.buffer, 0, seg_data.buffer_size ); |
53 | |
|
54 | 0 | int i; |
55 | 0 | char *tbuffer = (char *) seg_data.buffer; |
56 | |
|
57 | 0 | for( i = 0; i < seg_data.buffer_size; i++ ) |
58 | 0 | { |
59 | 0 | if( tbuffer[i] == '\r' ) |
60 | 0 | tbuffer[i] = '\n'; |
61 | |
|
62 | 0 | if( tbuffer[i] == '\0' ) |
63 | 0 | break; |
64 | 0 | } |
65 | |
|
66 | 0 | return std::string( (const char *) seg_data.buffer, i ); |
67 | 0 | } |
68 | | |
69 | | /************************************************************************/ |
70 | | /* WriteText() */ |
71 | | /************************************************************************/ |
72 | | |
73 | | void CPCIDSK_TEX::WriteText( const std::string &text_in ) |
74 | | |
75 | 0 | { |
76 | | // Transform all \n's to \r's (chr(10) to char(13)). |
77 | 0 | unsigned int i, i_out = 0; |
78 | 0 | std::string text = text_in; |
79 | |
|
80 | 0 | for( i = 0; i < text.size(); i++ ) |
81 | 0 | { |
82 | 0 | if( text[i] == '\0' ) |
83 | 0 | { |
84 | 0 | text.resize( i ); |
85 | 0 | break; |
86 | 0 | } |
87 | | |
88 | 0 | if( text[i] == '\n' && text[i+1] == '\r' ) |
89 | 0 | { |
90 | 0 | text[i_out++] = '\r'; |
91 | 0 | i++; |
92 | 0 | } |
93 | 0 | else if( text[i] == '\r' && text[i+1] == '\n' ) |
94 | 0 | { |
95 | 0 | text[i_out++] = '\r'; |
96 | 0 | i++; |
97 | 0 | } |
98 | 0 | else if( text[i] == '\n' ) |
99 | 0 | text[i_out++] = '\r'; |
100 | 0 | else |
101 | 0 | text[i_out++] = text[i]; |
102 | 0 | } |
103 | |
|
104 | 0 | text.resize( i_out ); |
105 | | |
106 | | // make sure we have a newline at the end. |
107 | |
|
108 | 0 | if( i_out > 0 && text[i_out-1] != '\r' ) |
109 | 0 | text += "\r"; |
110 | | |
111 | | // We really *ought* to ensure the rest of the segment |
112 | | // is zeroed out to properly adhere to the specification. |
113 | | // It might also be prudent to ensure the segment grows |
114 | | // in 32K increments to avoid "move to end of file churn" |
115 | | // if several text segments are growing a bit at a time |
116 | | // though this is uncommon. |
117 | |
|
118 | 0 | WriteToFile( text.c_str(), 0, text.size() + 1 ); |
119 | 0 | } |