11/*
22* SICAK - SIde-Channel Analysis toolKit
3- * Copyright (C) 2018 Petr Socha, FIT, CTU in Prague
3+ * Copyright (C) 2018-2019 Petr Socha, FIT, CTU in Prague
44*
55* This program is free software: you can redistribute it and/or modify
66* it under the terms of the GNU General Public License as published by
2323*
2424*
2525* \author Petr Socha
26- * \version 1.0
26+ * \version 1.1
2727*/
2828
2929
3232
3333#include < fstream>
3434#include < string>
35+ #include < cstring>
3536#include " types_basic.hpp"
3637#include " types_power.hpp"
3738#include " types_stat.hpp"
@@ -213,30 +214,42 @@ void writeArrayToFile(std::fstream & fs, const ArrayType<T> & arr){
213214*
214215*/
215216template <class T >
216- UnivariateContext <T> readContextFromFile (std::fstream & fs){
217+ Moments2DContext <T> readContextFromFile (std::fstream & fs){
217218
218- uint64_t ctxAttrs[7 ];
219+ // Read and compare ID signature
220+ Vector<uint8_t > ctxIdAttr (256 );
219221
220- fs. read ( reinterpret_cast < char *>(ctxAttrs), sizeof ( uint64_t ) * 7 );
222+ fillArrayFromFile (fs, ctxIdAttr );
221223
222- if (fs.fail ())
223- throw RuntimeException (" Failed to read context from file" );
224+ if (strcmp (reinterpret_cast <char *>(ctxIdAttr.data ()), " cz.cvut.fit.Sicak.Moments2DContext/1.1" )) throw RuntimeException (" Error reading a context from a file: invalid ID signature. Maybe incompatible version?" );
225+
226+ // Read size parameters
227+ Vector<uint64_t > ctxSizeAttrs (9 );
224228
225- UnivariateContext<T> ret (ctxAttrs[0 ], ctxAttrs[1 ], ctxAttrs[4 ], ctxAttrs[5 ], ctxAttrs[6 ]);
226- ret.p1Card () = ctxAttrs[2 ];
227- ret.p2Card () = ctxAttrs[3 ];
229+ fillArrayFromFile (fs, ctxSizeAttrs);
230+
231+ Moments2DContext<T> ret (ctxSizeAttrs (0 ), ctxSizeAttrs (1 ), ctxSizeAttrs (2 ), ctxSizeAttrs (3 ), ctxSizeAttrs (4 ), ctxSizeAttrs (5 ), ctxSizeAttrs (6 ));
232+ ret.p1Card () = ctxSizeAttrs (7 );
233+ ret.p2Card () = ctxSizeAttrs (8 );
228234
229- for (size_t order = 1 ; order <= ret.mOrder (); order++){
235+ // Read the data
236+ for (size_t order = 1 ; order <= ret.p1MOrder (); order++){
230237 fillArrayFromFile (fs, ret.p1M (order));
238+ }
239+
240+ for (size_t order = 1 ; order <= ret.p2MOrder (); order++){
231241 fillArrayFromFile (fs, ret.p2M (order));
232242 }
233243
234- for (size_t order = 2 ; order <= ret.csOrder (); order++){
244+ for (size_t order = 2 ; order <= ret.p1CSOrder (); order++){
235245 fillArrayFromFile (fs, ret.p1CS (order));
246+ }
247+
248+ for (size_t order = 2 ; order <= ret.p2CSOrder (); order++){
236249 fillArrayFromFile (fs, ret.p2CS (order));
237250 }
238251
239- for (size_t order = 1 ; order <= ret.acsOrder (); order++){
252+ for (size_t order = 1 ; order <= ret.p12ACSOrder (); order++){
240253 fillArrayFromFile (fs, ret.p12ACS (order));
241254 }
242255
@@ -251,33 +264,51 @@ UnivariateContext<T> readContextFromFile(std::fstream & fs){
251264*
252265*/
253266template <class T >
254- void writeContextToFile (std::fstream & fs, const UnivariateContext <T> & ctx){
267+ void writeContextToFile (std::fstream & fs, const Moments2DContext <T> & ctx){
255268
256- uint64_t ctxAttrs[7 ];
257- ctxAttrs[0 ] = ctx.p1Width ();
258- ctxAttrs[1 ] = ctx.p2Width ();
259- ctxAttrs[2 ] = ctx.p1Card ();
260- ctxAttrs[3 ] = ctx.p2Card ();
261- ctxAttrs[4 ] = ctx.mOrder ();
262- ctxAttrs[5 ] = ctx.csOrder ();
263- ctxAttrs[6 ] = ctx.acsOrder ();
269+ // Write ID signature
270+ const char * ctxId = ctx.getId ();
271+ if (strlen (ctxId) > 255 ) throw RuntimeException (" Context ID overflow." );
264272
265- fs.write (reinterpret_cast <char *>(ctxAttrs), sizeof (uint64_t ) * 7 );
273+ Vector<uint8_t > ctxIdAttr (256 , 0 );
274+ for (size_t i = 0 ; i < strlen (ctxId); i++){
275+ ctxIdAttr (i) = ctxId[i];
276+ }
266277
267- if (fs.fail ())
268- throw RuntimeException (" Failed to write context to file" );
278+ writeArrayToFile (fs, ctxIdAttr);
279+
280+ // Write size attributes
281+ Vector<uint64_t > ctxSizeAttrs (9 );
282+ ctxSizeAttrs (0 ) = ctx.p1Width ();
283+ ctxSizeAttrs (1 ) = ctx.p2Width ();
284+ ctxSizeAttrs (2 ) = ctx.p1MOrder ();
285+ ctxSizeAttrs (3 ) = ctx.p2MOrder ();
286+ ctxSizeAttrs (4 ) = ctx.p1CSOrder ();
287+ ctxSizeAttrs (5 ) = ctx.p2CSOrder ();
288+ ctxSizeAttrs (6 ) = ctx.p12ACSOrder ();
289+ ctxSizeAttrs (7 ) = ctx.p1Card ();
290+ ctxSizeAttrs (8 ) = ctx.p2Card ();
269291
270- for (size_t order = 1 ; order <= ctx.mOrder (); order++){
292+ writeArrayToFile (fs, ctxSizeAttrs);
293+
294+ // Write the data
295+ for (size_t order = 1 ; order <= ctx.p1MOrder (); order++){
271296 writeArrayToFile (fs, ctx.p1M (order));
297+ }
298+
299+ for (size_t order = 1 ; order <= ctx.p2MOrder (); order++){
272300 writeArrayToFile (fs, ctx.p2M (order));
273301 }
274302
275- for (size_t order = 2 ; order <= ctx.csOrder (); order++){
303+ for (size_t order = 2 ; order <= ctx.p1CSOrder (); order++){
276304 writeArrayToFile (fs, ctx.p1CS (order));
305+ }
306+
307+ for (size_t order = 2 ; order <= ctx.p2CSOrder (); order++){
277308 writeArrayToFile (fs, ctx.p2CS (order));
278309 }
279310
280- for (size_t order = 1 ; order <= ctx.acsOrder (); order++){
311+ for (size_t order = 1 ; order <= ctx.p12ACSOrder (); order++){
281312 writeArrayToFile (fs, ctx.p12ACS (order));
282313 }
283314
0 commit comments