Skip to content

Commit

Permalink
Merge pull request #1672 from GillesDuvert/new_attempt_close_1655
Browse files Browse the repository at this point in the history
tentative solution to #1655
  • Loading branch information
GillesDuvert authored Nov 16, 2023
2 parents c453dcb + dbc52d6 commit 1677a28
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 89 deletions.
14 changes: 13 additions & 1 deletion src/initsysvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -717,24 +717,28 @@ namespace SysVar
DVar *dpi = new DVar( "DPI", dpiData);
sysVarList.push_back( dpi);
sysVarRdOnlyList.push_back( dpi); // make it read only
sysVarNoSaveList.push_back( dpi); //Is not saveable as system-defined var

// !PI
DFloatGDL *piData = new DFloatGDL( (float)(4*atan(1.0)) );
DVar *pi = new DVar( "PI", piData);
sysVarList.push_back( pi);
sysVarRdOnlyList.push_back( pi); // make it read only
sysVarNoSaveList.push_back( pi); //Is not saveable as system-defined var

// !DTOR
DFloatGDL *dtorData = new DFloatGDL((*piData)[0] / 180.);// 0.0174533);
DVar *dtor = new DVar( "DTOR", dtorData);
sysVarList.push_back( dtor);
sysVarRdOnlyList.push_back( dtor); // make it read only
sysVarNoSaveList.push_back( dtor); //Is not saveable as system-defined var

// !RADEG
DFloatGDL *radegData = new DFloatGDL(180. / (*piData)[0]);// 57.2957764);
DVar *radeg = new DVar( "RADEG", radegData);
sysVarList.push_back( radeg);
sysVarRdOnlyList.push_back( radeg); // make it read only
sysVarNoSaveList.push_back( radeg); //Is not saveable as system-defined var

// !CONST
// source : http://physics.nist.gov/cgi-bin/cuu/Results?category=abbr_in
Expand Down Expand Up @@ -816,6 +820,7 @@ namespace SysVar
DVar *constant = new DVar("CONST",constantList);
sysVarList.push_back(constant);
sysVarRdOnlyList.push_back(constant); // make it read only
sysVarNoSaveList.push_back(constant); //Is not saveable as system-defined var


// ![XYZ]
Expand Down Expand Up @@ -1005,6 +1010,7 @@ namespace SysVar
vIx = sysVarList.size();
sysVarList.push_back(v);
sysVarRdOnlyList.push_back(v);
sysVarNoSaveList.push_back(v); //Is not saveable as system-defined var

// !Mouse
DStructGDL* MouseData = new DStructGDL( "!MOUSE");
Expand Down Expand Up @@ -1084,6 +1090,7 @@ namespace SysVar
err_stringIx = sysVarList.size();
sysVarList.push_back( err_stringVar );
sysVarRdOnlyList.push_back( err_stringVar); //!err_string IS a readonly variable!
sysVarNoSaveList.push_back( err_stringVar); //Is not saveable as system-defined var

// !VALUES
DStructGDL* valuesData = new DStructGDL( "!VALUES");
Expand Down Expand Up @@ -1125,13 +1132,15 @@ namespace SysVar
valuesIx = sysVarList.size();
sysVarList.push_back(values);
sysVarRdOnlyList.push_back( values);
sysVarNoSaveList.push_back( values); //Is not saveable as system-defined var

// !JOURNAL hold journal file lun
DLongGDL *journalData = new DLongGDL( 0);
DVar *journal = new DVar( "JOURNAL", journalData);
journalIx = sysVarList.size();
sysVarList.push_back( journal);
sysVarRdOnlyList.push_back( journal);
sysVarNoSaveList.push_back( journal); //Is not saveable as system-defined var

// !EXCEPT
DIntGDL *exceptData = new DIntGDL( 1);
Expand Down Expand Up @@ -1200,6 +1209,7 @@ namespace SysVar
cpuIx=sysVarList.size();
sysVarList.push_back( cpu);
sysVarRdOnlyList.push_back( cpu);
sysVarNoSaveList.push_back( cpu); //Is not saveable as system-defined var

#ifdef _OPENMP
if( omp_get_dynamic())
Expand Down Expand Up @@ -1235,6 +1245,7 @@ namespace SysVar
stimeIx=sysVarList.size();
sysVarList.push_back( stime);
sysVarRdOnlyList.push_back( stime); // make it read only
sysVarNoSaveList.push_back( stime); //Is not saveable as system-defined var

// !WARN
DStructGDL* warnData = new DStructGDL( "!WARN");
Expand Down Expand Up @@ -1286,7 +1297,8 @@ namespace SysVar
DVar *color = new DVar( "COLOR", colorData);
colorIx = sysVarList.size();
sysVarList.push_back(color);
sysVarRdOnlyList.push_back( color); //Is Readonly.
sysVarRdOnlyList.push_back( color); //Is Readonly.
sysVarNoSaveList.push_back( color); //Is not saveable as system-defined var
}

}
111 changes: 69 additions & 42 deletions src/saverestore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
}
}

//we write only "normal" (i.e. no PROMOTE64) headers
inline uint64_t writeNewRecordHeader(XDR *xdrs, int code){
int32_t rectype=code;
xdr_int32_t(xdrs, &rectype); //-16
Expand Down Expand Up @@ -183,11 +184,15 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
}
xdr_set_gdl_pos(xdrs, cur-12); //ptrs0
//copy next (64 bit) as two 32 bits. Should be OK on 32 bit machines as next is uint64.
if (BigEndian()) { //first 32 bit is low, second high (XDRS is BigEndian)
xdr_uint64_t(xdrs, &next);
} else {
uint32_t first,second;
first = ((uint32_t *) &next)[0];
second = ((uint32_t *) &next)[1];
xdr_uint32_t(xdrs, &first);
xdr_uint32_t(xdrs, &second);
}
xdr_set_gdl_pos(xdrs, next);
return next;
}
Expand Down Expand Up @@ -828,15 +833,15 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
}
//flags.

int32_t structure_def_flags=0;
int32_t structure_def_flags=0x28; //0;
if (ispredef) structure_def_flags |= 0x01;
if (isObject) structure_def_flags |= 0x08; //it is a CLASS
if (isObject) structure_def_flags |= 0x02;
if (is_super) structure_def_flags |= 0x04;
xdr_int32_t(xdrs, &structure_def_flags);
int32_t ntags=str->NTags();
xdr_int32_t(xdrs, &ntags);
int32_t struct_nbytes=(ispredef)?str->NBytes():0;
int32_t struct_nbytes=0; //(ispredef)?str->NBytes():0;
xdr_int32_t(xdrs, &struct_nbytes);
//if predef == 1 this ends the Struct_desc, meaning that we have already presented this structure.
if (ispredef) return;
Expand Down Expand Up @@ -932,14 +937,20 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
// 2) VARFLAGS
int32_t varflags;
if (!xdr_int32_t(xdrs, &varflags)) return NULL;

//This is not signaled in C. Marqwardt doc: a system variable (isSysVar=0x02 when function is called) has two supplemental int32, that we skip.
if (isSysVar & 0x02) {
int32_t dummy;
if (!xdr_int32_t(xdrs, &dummy)) return NULL;
if (!xdr_int32_t(xdrs, &dummy)) return NULL;
}

if (varflags & 0x40) return NullGDL::GetSingleInstance(); //special !NULL variable, no variable content follows.

if (varflags & 0x02) //defines a system variable.
{
isSysVar |= 0x02;
// cerr << " system " << endl;
}
}
if (varflags & 0x01)
{
isSysVar |= 0x01;
Expand All @@ -955,13 +966,7 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
{
isArray = true;
}
//This is not signaled in C. Marqwardt doc: a system variable has two supplemental int32 (0x04 and 0x02) here, that we skip.
if (isSysVar & 0x02)
{
int32_t dummy;
if (!xdr_int32_t(xdrs, &dummy)) return NULL;
if (!xdr_int32_t(xdrs, &dummy)) return NULL;
}

//we gonnna create a BaseGDL:

BaseGDL* var;
Expand Down Expand Up @@ -1282,15 +1287,30 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
if (readonly) varflags |= 0x01;
if (isObject) varflags |= 0x34; if (isStructure) varflags |= 0x24; else if (isArray) varflags |= 0x04;
if (nullsize) varflags=0x40;
xdr_int32_t(xdrs, &varflags);
if (nullsize) return;
//This is not signaled in C. Marqwardt doc: a system variable has two supplemental int32 (0x04 and 0x02).
if (isSysVar)
{
int32_t dummy;
xdr_int32_t(xdrs, &dummy);
xdr_int32_t(xdrs, &dummy);
}

//This is not signaled in C. Marqwardt doc: a system variable has two supplemental int32 as such:
if (isSysVar) {
if (typecode == 8) {
int32_t system = 54;
int32_t writeable = 52;
int32_t notwriteable = 53;
if (readonly) xdr_int32_t(xdrs, &notwriteable);
else xdr_int32_t(xdrs, &writeable);
xdr_int32_t(xdrs, &typecode);
xdr_int32_t(xdrs, &system); //system
} else {
int32_t noll = 0x0;
int32_t array = 0x04;
if (isArray) xdr_int32_t(xdrs, &array);
else xdr_int32_t(xdrs, &noll);
xdr_int32_t(xdrs, &typecode);
xdr_int32_t(xdrs, &varflags);
}
if (nullsize) return;
} else {
xdr_int32_t(xdrs, &varflags);
if (nullsize) return;
}

// if ARRAY or STRUCTURE, write ARRAY_DESC that follows:
if (isStructure||isArray) writeArrDesc(xdrs, var);
Expand Down Expand Up @@ -1601,7 +1621,7 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
//will start at TMESTAMP
uint64_t currentptr = 0;
uint64_t nextptr = LONG;
uint32_t ptrs0, ptrs1;
uint32_t ptr_low, ptr_high;
int32_t rectype;
int32_t UnknownLong;
bool SomethingFussyHappened = true;
Expand All @@ -1625,17 +1645,17 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
{
uint64_t my_ulong64;
if (!xdr_uint64_t(xdrs, &my_ulong64)) break;
nextptr = my_ulong64;
nextptr = my_ulong64; //HDR64 is followed by 2 longs.
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
} else //the 2 pointers may point together to a l64 address, bug #1545
{
if (!xdr_uint32_t(xdrs, &ptrs0)) break;
nextptr = ptrs0;
if (!xdr_uint32_t(xdrs, &ptrs1)) break;
DULong64 tmp = ptrs1;
{ //we read a sort of BigEndian format
if (!xdr_uint32_t(xdrs, &ptr_low)) break;
if (!xdr_uint32_t(xdrs, &ptr_high)) break;
nextptr = ptr_low;
uint64_t tmp = ptr_high;
nextptr |= (tmp << 32);
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
if (!xdr_int32_t(xdrs, &UnknownLong)) break; //only 1 long following in non-HDR64 format
if (nextptr <=LONG) e->Throw("error in pointers, please report.");
}

Expand Down Expand Up @@ -1673,6 +1693,7 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
break;
case PROMOTE64:
isHdr64 = true;
Message("Using unsupported PROMOTE64 pointers, expect problems.");
break;
case IDENTIFICATION:
if (verbose)
Expand Down Expand Up @@ -1808,12 +1829,11 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
nextptr = my_ulong64;
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
} else
{
if (!xdr_uint32_t(xdrs, &ptrs0)) break;
nextptr = ptrs0;
if (!xdr_uint32_t(xdrs, &ptrs1)) break;
DULong64 tmp = ptrs1;
} else {//we read a sort of BigEndian format
if (!xdr_uint32_t(xdrs, &ptr_low)) break;
if (!xdr_uint32_t(xdrs, &ptr_high)) break;
nextptr = ptr_low;
uint64_t tmp = ptr_high;
nextptr |= (tmp << 32);
if (!xdr_int32_t(xdrs, &UnknownLong)) break;
}
Expand Down Expand Up @@ -1857,8 +1877,16 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
}

fillVariableData(xdrs, ret);

if (isSysVar & 0x01) systemReadonlyVariableVector.push_back(make_pair(varName, ret));
if (isSysVar & 0x03) { //readonly system var
std::string name=varName.substr(1);
if (FindInVarList(sysVarRdOnlyList, name) != NULL) { //exists as readonly
if (FindInVarList(sysVarNoSaveList, name) != NULL) { //is a system-defined readonly, not updateable.
Message("Read only system defined system variable not restored: " + varName);
} else {
Message("Attempt to write to a readonly variable: " + varName);
}
} else systemReadonlyVariableVector.push_back(make_pair(varName, ret));
}
else if (isSysVar & 0x02) systemVariableVector.push_back(make_pair(varName, ret));
else variableVector.push_back(make_pair(varName, ret));
Guard<BaseGDL>* guard = new Guard<BaseGDL>;
Expand Down Expand Up @@ -2114,8 +2142,7 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
{
DVar* var = sysVarList[v];
DString sysVarName = var->Name();
if (FindInVarList(sysVarRdOnlyList, sysVarName) != NULL) continue; //systemReadonlyVariableVector.push_back(make_pair("!" + sysVarName, sysVarRdOnly->Data()));
if (FindInVarList(sysVarNoSaveList, sysVarName) != NULL) continue;
if (FindInVarList(sysVarNoSaveList, sysVarName) != NULL) continue; //only those need to be absent from a SVAE file. User-defined readonly sysVars CAN be written to a SAVE file.
systemVariableVector.push_back(make_pair("!" + sysVarName, var->Data()));
}
std::sort (systemVariableVector.begin(), systemVariableVector.end(), myfunctionToSortStringsInPair);
Expand Down Expand Up @@ -2258,16 +2285,16 @@ bool_t xdr_set_gdl_pos(XDR *x, long int y){
const char *dateformat="%a %h %d %T %Y";// day,month,day number,time,year
SizeT res=strftime(saveFileDatestring,MAX_DATE_STRING_LENGTH,dateformat,tstruct);
std::string saveFileUser = GetEnvString( "USER");
std::string saveFileHost = GetEnvString( "HOST");
if (saveFileHost == "") saveFileHost = GetEnvString( "HOSTNAME");
if (saveFileHost == "") {
std::string saveFileHost = ""; //GetEnvString( "HOST");
// if (saveFileHost == "") saveFileHost = GetEnvString( "HOSTNAME");
// if (saveFileHost == "") {
#define GDL_HOST_NAME_MAX 255
char gethost[GDL_HOST_NAME_MAX];
size_t lgethost=GDL_HOST_NAME_MAX;
// don't know if this primitive is available on Mac OS X
int success = gethostname(gethost, lgethost);
if( success == 0) saveFileHost=string(gethost);
}
// }
//TIMESTAMP
nextptr=writeTimeUserHost(xdrs, saveFileDatestring, (char*)saveFileUser.c_str(), (char*)saveFileHost.c_str());
int32_t format=9; //IDL v. 6.1 ++
Expand Down
46 changes: 0 additions & 46 deletions testsuite/test_save.pro

This file was deleted.

4 changes: 4 additions & 0 deletions testsuite/test_save_restore.pro
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ endfor
;
TEST_SR_COMPRESS, total_errors, test=test, verbose=verbose
;
; this test is only for maximize coverage:
defsysv,"!READONLY","ezcezcezcezc",1
save,/sys
restore
; ---- Final message ----
;
BANNER_FOR_TESTSUITE, 'TEST_SAVE_RESTORE', total_errors, short=short
Expand Down

0 comments on commit 1677a28

Please sign in to comment.