1*e949ce9dSXin LI 2*e949ce9dSXin LI#------------------------------------------------------------------------------ 3*e949ce9dSXin LI# $File: r,v 1.1 2025/02/10 17:48:42 christos Exp $ 4*e949ce9dSXin LI# file(1) magic for R's RDS and RData file formats 5*e949ce9dSXin LI# Copyright (C) 2025 Gert Hulselmans <hulselmansgert@gmail.com> 6*e949ce9dSXin LI# 7*e949ce9dSXin LI# URLS: 8*e949ce9dSXin LI# https://cran.r-project.org/doc/manuals/r-release/R-ints.html#Serialization-Formats 9*e949ce9dSXin LI# https://rdata.readthedocs.io/en/latest/_modules/rdata/parser/_parser.html 10*e949ce9dSXin LI# 11*e949ce9dSXin LI# Example files: 12*e949ce9dSXin LI# https://github.com/vnmabus/rdata/tree/develop/rdata/tests/data 13*e949ce9dSXin LI# 14*e949ce9dSXin LI############################################################################### 15*e949ce9dSXin LI 16*e949ce9dSXin LI 17*e949ce9dSXin LI############################################################################### 18*e949ce9dSXin LI# RDS format 19*e949ce9dSXin LI############################################################################### 20*e949ce9dSXin LI 21*e949ce9dSXin LI0 name RDS 22*e949ce9dSXin LI# Check for RDS ASCII formats. 23*e949ce9dSXin LI>0 string A\n2\n R RDS (ASCII format v2) 24*e949ce9dSXin LI>0 string A\n3\n R RDS (ASCII format v3) 25*e949ce9dSXin LI>0 string A\r\n2\r\n R RDS (ASCII CRLF format v2) 26*e949ce9dSXin LI>0 string A\r\n3\r\n R RDS (ASCII CRLF format v3) 27*e949ce9dSXin LI# Check for RDS binary formats with native word order. 28*e949ce9dSXin LI>0 string B\n\0\0\0 R RDS (Native (big-endian) word order format 29*e949ce9dSXin LI>>0 use RDS_binary_version_info 30*e949ce9dSXin LI>0 string B\n\2\0\0 R RDS (Native (little-endian) word order format 31*e949ce9dSXin LI>>0 use ^RDS_binary_version_info 32*e949ce9dSXin LI>0 string B\n\3\0\0 R RDS (Native (little-endian) word order format 33*e949ce9dSXin LI>>0 use ^RDS_binary_version_info 34*e949ce9dSXin LI# Check for RDS XDR binary save format. 35*e949ce9dSXin LI>0 string X\n\0\0\0 R RDS (XDR binary save format 36*e949ce9dSXin LI>>0 use RDS_binary_version_info 37*e949ce9dSXin LI 38*e949ce9dSXin LI 39*e949ce9dSXin LI# Parse version numbers from RDS if it was one of the binary versions. 40*e949ce9dSXin LI0 name RDS_binary_version_info 41*e949ce9dSXin LI>2 belong >-1 v%d) 42*e949ce9dSXin LI>6 beshort >-1 \b, written by R v%d. 43*e949ce9dSXin LI>8 byte >-1 \b%d. 44*e949ce9dSXin LI>9 byte >-1 \b%d 45*e949ce9dSXin LI>10 beshort >-1 \b, readable from R v%d. 46*e949ce9dSXin LI>12 byte >-1 \b%d. 47*e949ce9dSXin LI>13 byte >-1 \b%d 48*e949ce9dSXin LI>2 belong >2 49*e949ce9dSXin LI>>14 pstring/L x \b, %s encoded 50*e949ce9dSXin LI 51*e949ce9dSXin LI 52*e949ce9dSXin LI# Check if file is one of the RDS ASCII formats. 53*e949ce9dSXin LI0 string A 54*e949ce9dSXin LI>0 use RDS not_printed 55*e949ce9dSXin LI!:ext rds 56*e949ce9dSXin LI 57*e949ce9dSXin LI# Check if file is RDS binary native format. 58*e949ce9dSXin LI0 string B 59*e949ce9dSXin LI>0 use RDS not_printed 60*e949ce9dSXin LI!:ext rds 61*e949ce9dSXin LI 62*e949ce9dSXin LI# Check if file is RDS XDR binary save format. 63*e949ce9dSXin LI0 string X 64*e949ce9dSXin LI>0 use RDS not_printed 65*e949ce9dSXin LI!:ext rds 66*e949ce9dSXin LI 67*e949ce9dSXin LI 68*e949ce9dSXin LI############################################################################### 69*e949ce9dSXin LI# RData file formats: magic bytes followed by RDS container. 70*e949ce9dSXin LI############################################################################### 71*e949ce9dSXin LI 72*e949ce9dSXin LI0 string RDA2\n R RData version 2 (ASCII), 73*e949ce9dSXin LI!:ext rda/rdata 74*e949ce9dSXin LI>5 use RDS 75*e949ce9dSXin LI 76*e949ce9dSXin LI0 string RDA3\n R RData version 3 (ASCII), 77*e949ce9dSXin LI!:ext rda/rdata 78*e949ce9dSXin LI>5 use RDS 79*e949ce9dSXin LI 80*e949ce9dSXin LI0 string RDX2\n R RData version 2 (binary), 81*e949ce9dSXin LI!:ext rda/rdata 82*e949ce9dSXin LI>5 use RDS 83*e949ce9dSXin LI 84*e949ce9dSXin LI0 string RDX3\n R RData version 3 (binary), 85*e949ce9dSXin LI!:ext rda/rdata 86*e949ce9dSXin LI>5 use RDS 87