targets/Win32/plc_Win32_main_retain.c
author Edouard Tisserant <edouard.tisserant@gmail.com>
Thu, 10 Dec 2020 11:37:27 +0100
changeset 2697 93333d206198
parent 2499 68f4f2d4516b
permissions -rw-r--r--
Python Safe Globals now have more reliable triggering of OnChange call. Added "Onchange" object to accessible runtime variables that let user python code see count of changes and first and last values.
2178
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     1
/*
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     2
  This file is part of Beremiz, a Integrated Development Environment for
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     3
  programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     4
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     5
  See COPYING.runtime
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     6
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     7
  Copyright (C) 2018: Sergey Surkov <surkov.sv@summatechnology.ru>
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     8
  Copyright (C) 2018: Andrey Skvortsov <andrej.skvortzov@gmail.com>
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
     9
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
    10
*/
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2174
diff changeset
    11
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    12
#ifndef HAVE_RETAIN
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    13
#include <stdio.h>
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    14
#include <stdint.h>
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    15
#include <unistd.h>
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    16
#include "iec_types.h"
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    17
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
    18
int GetRetainSize(void);
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    19
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    20
/* Retain buffer.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    21
FILE *retain_buffer;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    22
const char rb_file[]      = "retain_buffer_file";
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    23
const char rb_file_bckp[] = "retain_buffer_file.bak";
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    24
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    25
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    26
/* Retain header struct.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    27
struct retain_info_t {
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    28
	uint32_t retain_size;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    29
	uint32_t hash_size;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    30
	uint8_t* hash;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    31
	uint32_t header_offset;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    32
	uint32_t header_crc;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    33
};
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    34
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    35
/* Init retain info structure.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    36
struct retain_info_t retain_info;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    37
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    38
/* CRC lookup table and initial state.  */
2499
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    39
static const uint32_t crc32_table[256] = {
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    40
	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    41
	0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    42
	0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    43
	0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    44
	0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    45
	0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    46
	0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    47
	0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    48
	0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    49
	0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    50
	0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    51
	0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    52
	0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    53
	0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    54
	0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    55
	0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    56
	0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    57
	0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    58
	0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    59
	0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    60
	0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    61
	0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    62
	0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    63
	0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    64
	0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    65
	0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    66
	0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    67
	0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    68
	0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    69
	0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    70
	0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    71
	0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    72
};
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    73
uint32_t retain_crc;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    74
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    75
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    76
/* Calculate CRC32 for len bytes from pointer buf with init starting value.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    77
uint32_t GenerateCRC32Sum(const void* buf, unsigned int len, uint32_t init)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    78
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    79
	uint32_t crc = ~init;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    80
	unsigned char* current = (unsigned char*) buf;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    81
	while (len--)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    82
		crc = crc32_table[(crc ^ *current++) & 0xFF] ^ (crc >> 8);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    83
	return ~crc;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    84
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    85
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    86
/* Calc CRC32 for retain file byte by byte.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    87
int CheckFileCRC(FILE* file_buffer)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    88
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    89
	/* Set the magic constant for one-pass CRC calc according to ZIP CRC32.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    90
	const uint32_t magic_number = 0x2144df1c;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    91
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    92
	/* CRC initial state.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    93
	uint32_t calc_crc32 = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    94
	char data_block = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    95
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    96
	while(!feof(file_buffer)){
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    97
		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
    98
			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(data_block), calc_crc32);
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    99
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   100
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   101
	/* Compare crc result with a magic number.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   102
	return (calc_crc32 == magic_number) ? 1 : 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   103
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   104
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   105
/* Compare current hash with hash from file byte by byte.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   106
int CheckFilehash(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   107
{
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
   108
	unsigned int k;
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   109
	int offset = sizeof(retain_info.retain_size);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   110
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   111
	rewind(retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   112
	fseek(retain_buffer, offset , SEEK_SET);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   113
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   114
	uint32_t size;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   115
	fread(&size, sizeof(size), 1, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   116
	if (size != retain_info.hash_size)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   117
		return 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   118
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   119
	for(k = 0; k < retain_info.hash_size; k++){
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   120
		uint8_t file_digit;
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
   121
		fread(&file_digit, sizeof(file_digit), 1, retain_buffer);
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   122
		if (file_digit != *(retain_info.hash+k))
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   123
			return 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   124
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   125
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   126
	return 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   127
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   128
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   129
void InitRetain(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   130
{
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
   131
	unsigned int i;
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   132
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   133
	/* Get retain size in bytes */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   134
	retain_info.retain_size = GetRetainSize();
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   135
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   136
	/* Hash stored in retain file as array of char in hex digits
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   137
	   (that's why we divide strlen in two).  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   138
	retain_info.hash_size = PLC_ID ? strlen(PLC_ID)/2 : 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   139
	//retain_info.hash_size = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   140
	retain_info.hash = malloc(retain_info.hash_size);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   141
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   142
	/* Transform hash string into byte sequence.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   143
	for (i = 0; i < retain_info.hash_size; i++) {
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   144
		int byte = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   145
		sscanf((PLC_ID + i*2), "%02X", &byte);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   146
		retain_info.hash[i] = byte;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   147
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   148
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   149
	/* Calc header offset.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   150
	retain_info.header_offset = sizeof(retain_info.retain_size) + \
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   151
		sizeof(retain_info.hash_size) + \
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   152
		retain_info.hash_size;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   153
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   154
	/*  Set header CRC initial state.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   155
	retain_info.header_crc = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   156
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   157
	/* Calc crc for header.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   158
	retain_info.header_crc = GenerateCRC32Sum(
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   159
		&retain_info.retain_size,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   160
		sizeof(retain_info.retain_size),
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   161
		retain_info.header_crc);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   162
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   163
	retain_info.header_crc = GenerateCRC32Sum(
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   164
		&retain_info.hash_size,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   165
		sizeof(retain_info.hash_size),
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   166
		retain_info.header_crc);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   167
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   168
	retain_info.header_crc = GenerateCRC32Sum(
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   169
		retain_info.hash,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   170
		retain_info.hash_size,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   171
		retain_info.header_crc);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   172
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   173
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   174
void CleanupRetain(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   175
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   176
	/* Free hash memory.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   177
	free(retain_info.hash);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   178
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   179
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   180
int CheckRetainFile(const char * file)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   181
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   182
	retain_buffer = fopen(file, "rb");
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   183
	if (retain_buffer) {
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   184
		/* Check CRC32 and hash.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   185
		if (CheckFileCRC(retain_buffer))
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   186
			if (CheckFilehash())
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   187
				return 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   188
		fclose(retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   189
		retain_buffer = NULL;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   190
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   191
	return 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   192
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   193
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   194
int CheckRetainBuffer(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   195
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   196
	retain_buffer = NULL;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   197
	if (!retain_info.retain_size)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   198
		return 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   199
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   200
	/* Check latest retain file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   201
	if (CheckRetainFile(rb_file))
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   202
		return 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   203
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   204
	/* Check if we have backup.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   205
	if (CheckRetainFile(rb_file_bckp))
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   206
		return 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   207
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   208
	/* We don't have any valid retain buffer - nothing to remind.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   209
	return 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   210
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   211
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   212
#ifndef FILE_RETAIN_SAVE_PERIOD_S
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   213
#define FILE_RETAIN_SAVE_PERIOD_S 1.0
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   214
#endif
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   215
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   216
static double CalcDiffSeconds(IEC_TIME* t1, IEC_TIME *t2)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   217
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   218
	IEC_TIME dt ={
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   219
		t1->tv_sec  - t2->tv_sec,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   220
		t1->tv_nsec - t2->tv_nsec
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   221
	};
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   222
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   223
	if ((dt.tv_nsec < -1000000000) || ((dt.tv_sec > 0) && (dt.tv_nsec < 0))){
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   224
		dt.tv_sec--;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   225
		dt.tv_nsec += 1000000000;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   226
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   227
	if ((dt.tv_nsec > +1000000000) || ((dt.tv_sec < 0) && (dt.tv_nsec > 0))){
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   228
		dt.tv_sec++;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   229
		dt.tv_nsec -= 1000000000;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   230
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   231
	return dt.tv_sec + 1e-9*dt.tv_nsec;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   232
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   233
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   234
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   235
int RetainSaveNeeded(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   236
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   237
	int ret = 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   238
	static IEC_TIME last_save;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   239
	IEC_TIME now;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   240
	double diff_s;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   241
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   242
	/* no retain */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   243
	if (!retain_info.retain_size)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   244
		return 0;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   245
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   246
	/* periodic retain flush to avoid high I/O load */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   247
	PLC_GetTime(&now);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   248
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   249
	diff_s = CalcDiffSeconds(&now, &last_save);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   250
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   251
	if ((diff_s > FILE_RETAIN_SAVE_PERIOD_S) || ForceSaveRetainReq()) {
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   252
		ret = 1;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   253
		last_save = now;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   254
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   255
	return ret;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   256
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   257
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   258
void ValidateRetainBuffer(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   259
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   260
	if (!retain_buffer)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   261
		return;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   262
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   263
	/* Add retain data CRC to the end of buffer file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   264
	fseek(retain_buffer, 0, SEEK_END);
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
   265
	fwrite(&retain_crc, sizeof(retain_crc), 1, retain_buffer);
2174
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   266
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   267
	/* Sync file buffer and close file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   268
#ifdef __WIN32
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   269
	fflush(retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   270
#else
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   271
	fsync(fileno(retain_buffer));
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   272
#endif
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   273
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   274
	fclose(retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   275
	retain_buffer = NULL;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   276
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   277
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   278
void InValidateRetainBuffer(void)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   279
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   280
	if (!RetainSaveNeeded())
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   281
		return;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   282
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   283
	/* Rename old retain file into *.bak if it exists.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   284
	rename(rb_file, rb_file_bckp);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   285
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   286
	/* Set file CRC initial value.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   287
	retain_crc = retain_info.header_crc;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   288
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   289
	/* Create new retain file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   290
	retain_buffer = fopen(rb_file, "wb+");
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   291
	if (!retain_buffer) {
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   292
		fprintf(stderr, "Failed to create retain file : %s\n", rb_file);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   293
		return;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   294
	}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   295
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   296
	/* Write header to the new file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   297
	fwrite(&retain_info.retain_size,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   298
		sizeof(retain_info.retain_size), 1, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   299
	fwrite(&retain_info.hash_size,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   300
		sizeof(retain_info.hash_size),   1, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   301
	fwrite(retain_info.hash ,
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   302
		sizeof(char), retain_info.hash_size, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   303
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   304
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   305
void Retain(unsigned int offset, unsigned int count, void *p)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   306
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   307
	if (!retain_buffer)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   308
		return;
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   309
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   310
	/* Generate CRC 32 for each data block.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   311
	retain_crc = GenerateCRC32Sum(p, count, retain_crc);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   312
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   313
	/* Save current var in file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   314
	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   315
	fwrite(p, count, 1, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   316
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   317
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   318
void Remind(unsigned int offset, unsigned int count, void *p)
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   319
{
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   320
	/* Remind variable from file.  */
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   321
	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   322
	fread((void *)p, count, 1, retain_buffer);
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   323
}
55611282b909 Use the same retain implementation for Win32 targets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   324
#endif // !HAVE_RETAIN