R magic number from the R source
Implements the writing/reading of the version and format of an RData file or blob.
This commit is contained in:
106
src/Rmagic.c
Normal file
106
src/Rmagic.c
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
#include "Rmagic.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int R_WriteMagic(FILE *fp, int number)
|
||||||
|
{
|
||||||
|
unsigned char buf[5];
|
||||||
|
size_t res;
|
||||||
|
|
||||||
|
number = abs(number);
|
||||||
|
switch (number) {
|
||||||
|
case R_MAGIC_ASCII_V1: /* Version 1 - R Data, ASCII Format */
|
||||||
|
strcpy((char*)buf, "RDA1");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_BINARY_V1: /* Version 1 - R Data, Binary Format */
|
||||||
|
strcpy((char*)buf, "RDB1");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_XDR_V1: /* Version 1 - R Data, XDR Binary Format */
|
||||||
|
strcpy((char*)buf, "RDX1");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_ASCII_V2: /* Version 2 - R Data, ASCII Format */
|
||||||
|
strcpy((char*)buf, "RDA2");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_BINARY_V2: /* Version 2 - R Data, Binary Format */
|
||||||
|
strcpy((char*)buf, "RDB2");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_XDR_V2: /* Version 2 - R Data, XDR Binary Format */
|
||||||
|
strcpy((char*)buf, "RDX2");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_ASCII_V3: /* Version >=3 - R Data, ASCII Format */
|
||||||
|
strcpy((char*)buf, "RDA3");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_BINARY_V3: /* Version >=3 - R Data, Binary Format */
|
||||||
|
strcpy((char*)buf, "RDB3");
|
||||||
|
break;
|
||||||
|
case R_MAGIC_XDR_V3: /* Version >=3 - R Data, XDR Binary Format */
|
||||||
|
strcpy((char*)buf, "RDX3");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buf[0] = (unsigned char)((number / 1000) % 10 + '0');
|
||||||
|
buf[1] = (unsigned char)((number / 100) % 10 + '0');
|
||||||
|
buf[2] = (unsigned char)((number / 10) % 10 + '0');
|
||||||
|
buf[3] = (unsigned char)(number % 10 + '0');
|
||||||
|
}
|
||||||
|
buf[4] = '\n';
|
||||||
|
|
||||||
|
res = fwrite((char*)buf, sizeof(char), 5, fp);
|
||||||
|
if(res != 5) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int R_ReadMagic(FILE *fp)
|
||||||
|
{
|
||||||
|
unsigned char buf[6];
|
||||||
|
int d1, d2, d3, d4;
|
||||||
|
size_t count;
|
||||||
|
|
||||||
|
count = fread((char*)buf, sizeof(char), 5, fp);
|
||||||
|
if (count != 5) {
|
||||||
|
if (count == 0) {
|
||||||
|
return R_MAGIC_EMPTY;
|
||||||
|
} else {
|
||||||
|
return R_MAGIC_CORRUPT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Version 1 */
|
||||||
|
if (strncmp((char*)buf, "RDA1\n", 5) == 0) {
|
||||||
|
return R_MAGIC_ASCII_V1;
|
||||||
|
} else if (strncmp((char*)buf, "RDB1\n", 5) == 0) {
|
||||||
|
return R_MAGIC_BINARY_V1;
|
||||||
|
} else if (strncmp((char*)buf, "RDX1\n", 5) == 0) {
|
||||||
|
return R_MAGIC_XDR_V1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Version 2 */
|
||||||
|
if (strncmp((char*)buf, "RDA2\n", 5) == 0) {
|
||||||
|
return R_MAGIC_ASCII_V2;
|
||||||
|
} else if (strncmp((char*)buf, "RDB2\n", 5) == 0) {
|
||||||
|
return R_MAGIC_BINARY_V2;
|
||||||
|
} else if (strncmp((char*)buf, "RDX2\n", 5) == 0) {
|
||||||
|
return R_MAGIC_XDR_V2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Version 3 */
|
||||||
|
if (strncmp((char*)buf, "RDA3\n", 5) == 0) {
|
||||||
|
return R_MAGIC_ASCII_V3;
|
||||||
|
} else if (strncmp((char*)buf, "RDB3\n", 5) == 0) {
|
||||||
|
return R_MAGIC_BINARY_V3;
|
||||||
|
} else if (strncmp((char*)buf, "RDX3\n", 5) == 0) {
|
||||||
|
return R_MAGIC_XDR_V3;
|
||||||
|
} else if (strncmp((char *)buf, "RD", 2) == 0) {
|
||||||
|
return R_MAGIC_MAYBE_TOONEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Intel gcc seems to screw up a single expression here */
|
||||||
|
d1 = (buf[3] - '0') % 10;
|
||||||
|
d2 = (buf[2] - '0') % 10;
|
||||||
|
d3 = (buf[1] - '0') % 10;
|
||||||
|
d4 = (buf[0] - '0') % 10;
|
||||||
|
return d1 + 10 * d2 + 100 * d3 + 1000 * d4;
|
||||||
|
}
|
||||||
32
src/Rmagic.h
Normal file
32
src/Rmagic.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef __R_MAGIC_H__
|
||||||
|
#define __R_MAGIC_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define R_STREAM_VERSION 3
|
||||||
|
|
||||||
|
#define R_MAGIC_ASCII_V3 3001
|
||||||
|
#define R_MAGIC_BINARY_V3 3002
|
||||||
|
#define R_MAGIC_XDR_V3 3003
|
||||||
|
#define R_MAGIC_ASCII_V2 2001
|
||||||
|
#define R_MAGIC_BINARY_V2 2002
|
||||||
|
#define R_MAGIC_XDR_V2 2003
|
||||||
|
#define R_MAGIC_ASCII_V1 1001
|
||||||
|
#define R_MAGIC_BINARY_V1 1002
|
||||||
|
#define R_MAGIC_XDR_V1 1003
|
||||||
|
#define R_MAGIC_EMPTY 999
|
||||||
|
#define R_MAGIC_CORRUPT 998
|
||||||
|
#define R_MAGIC_MAYBE_TOONEW 997
|
||||||
|
|
||||||
|
/* pre-1 formats (R < 0.99.0) */
|
||||||
|
#define R_MAGIC_BINARY 1975
|
||||||
|
#define R_MAGIC_ASCII 1976
|
||||||
|
#define R_MAGIC_XDR 1977
|
||||||
|
#define R_MAGIC_BINARY_VERSION16 1971
|
||||||
|
#define R_MAGIC_ASCII_VERSION16 1972
|
||||||
|
|
||||||
|
int R_WriteMagic(FILE *fp, int number);
|
||||||
|
|
||||||
|
int R_ReadMagic(FILE *fp);
|
||||||
|
|
||||||
|
#endif // __R_MAGIC_H__
|
||||||
Reference in New Issue
Block a user