-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathicc_cgats_filter.h
273 lines (245 loc) · 10.1 KB
/
icc_cgats_filter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/*
* ICC Examin ist eine ICC Profil Betrachter
*
* Copyright (C) 2005-2008 Kai-Uwe Behrmann
*
* Autor: Kai-Uwe Behrmann <[email protected]>
*
* 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 2
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* -----------------------------------------------------------------------------
*
* cgats Fehlerkorrekturen
*
*/
#ifndef ICC_CGATS_FILTER_H
#define ICC_CGATS_FILTER_H
#include "icc_utils.h"
#include "icc_list.h"
#include <string>
#define STD_CGATS_FIELDS 44
/**
* Arbeitsweise
*
* Die Klasse CgatsFilter folgt dem Kontextmodell. Es können Eigenschaften
* eingestellt werden, Daten geladen und die Auswertung erfolgt mit Hilfe der
* zuvor eingestellten Optionen.
*/
class CgatsFilter
{
// statische Hilfsobjekte
static const char *cgats_alnum_; //!< @brief non-integral type
static const char *cgats_alpha_;
static const char *cgats_numerisch_;
static const char *cgats_ziffer_;
static const char *leer_zeichen_;
//! @brief Standard CGATS Schlüsselwörter
static const char ss_woerter_[STD_CGATS_FIELDS][16];
public:
CgatsFilter ()
{ DBG_PROG_START
//! @brief Initialisierung
typ_ = LCMS;
//! @brief das Ersetzungswort für spektrale Feldbezeichner
spektral = "SPECTRAL_";
anfuehrungsstriche_setzen = false;
//! @brief eine erste Messung wird benötigt
messungen.resize(1);
DBG_PROG_ENDE
}
~CgatsFilter () {; }
private:
//! @brief Kopieren
CgatsFilter& copy (const CgatsFilter & o)
{
typ_ = o.typ_;
kopf = o.kopf;
kommentar = o.kommentar;
spektral = o.spektral;
messungen = o.messungen;
anfuehrungsstriche_setzen = o.anfuehrungsstriche_setzen;
log = o.log;
return *this;
}
public:
CgatsFilter (const CgatsFilter& o) { copy(o); }
CgatsFilter& operator = (const CgatsFilter& o) { return copy (o); }
//! @brief Laden der CGATS ascii Daten
void lade (const char* text, size_t size) { clear();
data_orig_.assign( text,0,size ); }
void lade (std::string &text) { clear(); data_orig_ = text; }
//! @brief Zurücksetzen der Datenstrukturen - keine neues Verhalten
void clear() { data_.resize(0); data_orig_.resize(0);
messungen.clear(); messungen.resize(1);
log.clear();
zeilen_.clear();
s_woerter_.resize(STD_CGATS_FIELDS);
for(unsigned i = 0; i < STD_CGATS_FIELDS; ++i)
s_woerter_[i] = ss_woerter_[i];
}
//! @brief Ausgeben
std::string lcms_gefiltert() { typ_ = LCMS; cgats_korrigieren_();
return data_; }
//! @brief Modus
std::string max_korrigieren(){ typ_ = MAX_KORRIGIEREN; cgats_korrigieren_();
return data_; }
// Optionen
//! @brief frei wählbarer Kopf ( standardgemäß 7 Zeichen lang )
std::string kopf;
//! @brief frei wählbarer Kommentar ( wird nach Kopfzeile eingefügt )
std::string kommentar;
//! @brief frei wählbarer Bezeichner für Spektraldaten (SPECTRAL_)
std::string spektral;
//! @brief für ausgegebene Worte im DATA Block
bool anfuehrungsstriche_setzen;
//! @brief Messdaten
struct Messung {
ICClist<std::string> kommentare; //!< @brief KEYWORD ...
ICClist<ICClist<std::string> > felder; //!< @brief DATA_FIELD
ICClist<ICClist<std::string> > block; //!< @brief DATA
ICClist<int> line; //!< @brief CGATS DATA line
int feld_spalten; //!< @brief NUMBER_OF_FIELDS
int block_zeilen; //!< @brief NUMBER_OF_SETS
Messung ()
{
feld_spalten = 0;
block_zeilen = 0;
}
};
ICClist<Messung> messungen; //!< @brief teilweise strukturierte Messdaten
private:
void neuerAbschnitt_ ();
public:
/** @brief Die Liste von Mitteilungen und Auffälligkeiten
*
* Anm.: bei zusammengefassten Vorgängen ist eventuell nur "meldung" gültig
*/
struct Log {
ICClist<std::string> eingabe; //!< @brief die bearbeiteten Zeilen (>=0)
ICClist<std::string> ausgabe; //!< @brief die resultierenden Zeilen (>=0)
std::string meldung; //!< @brief eine Mitteilung für den Vorgang
int original_zeile; //!< @brief Zeilennummer der Eingabe
};
ICClist<Log> log;
private:
/** @brief --- Hauptfunktion ---
o Konvertierung in Standard unix Dateiformat mit LF
o Suchen und Ersetzen bekannnter Abweichungen (in data_)
o zeilenweises lesen und editieren (in zeilen_)
o verdecken der Kommentare (mit lokalem string gtext)
o kontrollieren der Blöckanfänge und -enden
o die Dateisignatur reparieren (7 / 14 byte lang)
o zwischen den Blöcken: Schlüsselworte erkennen und bearbeiten
o die Zeilen wieder zusamenfügen und als einen std::string zurückgeben
*/
std::string cgats_korrigieren_ ();
// - Hilfsfunktionen -
/** @brief Auszählen der Formate(Farbkanäle) im DATA_FORMAT Block
*
* zeile : zu bearbeitende kommentarfreie Zeile
* zeile_x : Nummer der gewählten Zeile
*/
int sucheInDATA_FORMAT_( std::string &zeile, int &zeile_x );
/** @brief klassifiziert CGATS Schlüsselworte; sinnvoll ausserhalb der Blöcke
*
* zeile : zu bearbeitende kommentarfreie Zeile
*/
int sucheSchluesselwort_( std::string zeile );
/** @brief eine Zeile ausserhalb der beiden DATA und FORMAT Blöcke nach
* Klassifizierungsschlüssel bearbeiten
*
* zeilen : Referenz auf alle Text Zeilen
* zeile_x : Nummer der gewählten Zeile
* editieren : Bearbeitungscode aus sucheSchluesselwort_()
* cmy : Schalter für CB CMY Feldbezeichner
*/
int editZeile_( ICClist<std::string> &zeilen,
int zeile_x, int editieren, bool cmy );
// allgemeine Textbearbeitung
/** @brief Textvektor Bearbeitung fürs zeilenweise Editieren
*
* zeilen : Referenz auf alle Text Zeilen
* zeile_x : Nummer der gewählten Zeile
*/
void suchenLoeschen_ ( ICClist<std::string> &zeilen,
std::string text );
/** @brief doppelte Zeilen löschen
*
* zeilen : Referenz auf alle Text Zeilen
*/
int zeilenOhneDuplikate_ ( ICClist<std::string> &zeilen );
public:
/** @brief Buchstabenworte von Zahlen unterscheiden
*
* zeilen : Referenz auf alle Text Zeilen
*/
ICClist<std::string> unterscheideZiffernWorte ( std::string &zeile );
private:
/** @brief Zeile von pos bis Ende in Anführungszeichen setzen
*
* zeilen : Referenz auf alle Text Zeilen
*/
void setzeWortInAnfuehrungszeichen_ ( std::string &zeile,
std::string::size_type pos );
/** @brief bequem einen Eintrag zu log hinzufügen
*
* meldung : Beschreibung
* zeile_x : Zeile des Auftretens des Ereignisses
* zeile1 : Ursprünglisch Zeilen
* zeile2 : geänderte Zeilen
*/
unsigned int logEintrag_ (std::string meldung, int zeile_x,
std::string zeile1, std::string zeile2 );
/** @brief angepasste Variante von suchenErsetzen()
*
* text : Text Zeile
* suchen : zu suchendes Wort
* ersetzen : ersetzen durch
* pos : Startposition in "text"
*/
int suchenUndErsetzen_ ( std::string &text,
const char* suchen,
const char* ersetzen,
std::string::size_type pos );
//! @brief Schlüsselwort -> passende Korrekturen
enum {
BELASSEN,
KEYWORD,
ANFUEHRUNGSSTRICHE,
DATA_FORMAT_ZEILE,
AUSKOMMENTIEREN,
LINEARISIERUNG,
CMY_DATEN,
CMYK_DATEN,
SAMPLE_KORRIGIEREN
};
// benötigte dynamische Hilfsobjekte
std::string data_; //!< @brief der korrigierte CGATS Text
std::string data_orig_; //!< @brief eine Kopie vom Original
ICClist<std::string> s_woerter_; //!< @brief Schlüsselwörter
ICClist<std::string> felder_; //!< @brief die Feldnamen
ICClist<std::string> zeilen_; //!< @brief Arbeitsspeicher
enum Typ_ {
LCMS,
MAX_KORRIGIEREN
};
enum Typ_ typ_; //!< @brief Art des Filterns
int zeile_letztes_NUMBER_OF_FIELDS;
};
//! @brief fertig zum Anwenden
std::string cgats_korrigieren( char* data, size_t size );
//! @brief fertig zum Anwenden
std::string cgats_max_korrigieren( char* data, size_t size );
#endif // ICC_CGATS_FILTER_H