Task 612: .REXX File Format
Task 612: .REXX File Format
File Format Specifications for .REXX
The .REXX file extension is associated with source code files for the REXX (Restructured Extended Executor) programming language. It is a text-based format, not a binary one, and follows the syntax rules of the REXX language as defined by IBM and the ANSI X3.274-1996 standard. There is no formal "file format" specification in the sense of a structured binary layout with headers or fields; instead, it is plain text containing REXX script instructions. Files are editable with any text editor and executable with a REXX interpreter.
- List of all the properties of this file format intrinsic to its file system:
- File extension: .rexx (case-insensitive, sometimes .rex is used interchangeably)
- MIME type: text/x-rexx or text/plain
- Encoding: Typically ASCII (on Unix-like systems) or EBCDIC (on mainframes like z/OS)
- Line endings: Platform-dependent (CRLF on Windows, LF on Unix, or platform-specific on mainframes)
- Signature/Identifier: The file must start with a comment line beginning with "/*" and containing the word "REXX" (in uppercase) within that comment to be recognized as a valid REXX exec by some systems (e.g., TSO/E on z/OS).
- Content structure: Free-form text following REXX syntax, including clauses, variables, functions, and host commands; no fixed binary fields or magic numbers beyond the text signature
- Two direct download links for files of format .REXX:
- https://discmaster.textfiles.com/browse/3297/Aminet%252028%2520(1998)(GTI%2520-%2520Schatztruhe)[!][Dec%25201998].iso/Aminet/comm/maxs/MaxRexx.lha/MAXREXX/Examples/Everything.Rexx
- https://discmaster.textfiles.com/browse/3297/Aminet%252028%2520(1998)(GTI%2520-%2520Schatztruhe)[!][Dec%25201998].iso/Aminet/comm/maxs/MaxRexx.lha/MAXREXX/Examples/quit.rexx
These links provide raw text views of the .REXX files, which can be saved directly as .rexx files.
- Ghost blog embedded HTML JavaScript for drag-and-drop .REXX file dump:
Here's a standalone HTML file with embedded JavaScript that allows dragging and dropping a .REXX file. It reads the file as text, extracts and displays the properties listed above (e.g., checks for signature, detects line endings, assumes encoding, shows content). Save this as an HTML file and open in a browser.
Drag and Drop .REXX File
- Python class for .REXX files:
import os
class RexxFileHandler:
def __init__(self, filepath):
self.filepath = filepath
self.extension = '.rexx'
self.mime_type = 'text/x-rexx'
self.encoding = 'utf-8' # Assumed; could detect with chardet
self.line_endings = None
self.has_signature = False
self.content = ''
self.structure = 'REXX source code text'
def read_and_decode(self):
with open(self.filepath, 'rb') as f:
raw = f.read()
self.content = raw.decode(self.encoding, errors='replace')
lines = self.content.splitlines(keepends=True)
if lines:
first_line = lines[0]
self.has_signature = first_line.startswith('/*') and 'REXX' in first_line.upper()
# Detect line endings from first line
if '\r\n' in first_line:
self.line_endings = 'CRLF'
elif '\r' in first_line:
self.line_endings = 'CR'
else:
self.line_endings = 'LF'
def print_properties(self):
print(f"File Extension: {self.extension}")
print(f"MIME Type: {self.mime_type}")
print(f"Encoding: {self.encoding}")
print(f"Line Endings: {self.line_endings}")
print(f"Signature Valid: {'Yes' if self.has_signature else 'No'}")
print(f"Content Structure: {self.structure}")
print(f"Full Content:\n{self.content}")
def write(self, new_content, add_signature_if_missing=True):
if add_signature_if_missing and not new_content.startswith('/*'):
new_content = '/* REXX */\n' + new_content
with open(self.filepath, 'w', encoding=self.encoding) as f:
f.write(new_content) # Writes with platform line endings
# Example usage:
# handler = RexxFileHandler('example.rexx')
# handler.read_and_decode()
# handler.print_properties()
# handler.write('say "Hello World"')
- Java class for .REXX files:
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class RexxFileHandler {
private String filepath;
private String extension = ".rexx";
private String mimeType = "text/x-rexx";
private String encoding = "UTF-8"; // Assumed
private String lineEndings;
private boolean hasSignature;
private String content;
private String structure = "REXX source code text";
public RexxFileHandler(String filepath) {
this.filepath = filepath;
}
public void readAndDecode() throws IOException {
byte[] raw = Files.readAllBytes(Paths.get(filepath));
content = new String(raw, StandardCharsets.UTF_8);
String[] lines = content.split("\\r?\\n|\\r");
if (lines.length > 0) {
String firstLine = lines[0];
hasSignature = firstLine.startsWith("/*") && firstLine.toUpperCase().contains("REXX");
}
// Detect line endings
if (content.contains("\r\n")) {
lineEndings = "CRLF";
} else if (content.contains("\r")) {
lineEndings = "CR";
} else {
lineEndings = "LF";
}
}
public void printProperties() {
System.out.println("File Extension: " + extension);
System.out.println("MIME Type: " + mimeType);
System.out.println("Encoding: " + encoding);
System.out.println("Line Endings: " + lineEndings);
System.out.println("Signature Valid: " + (hasSignature ? "Yes" : "No"));
System.out.println("Content Structure: " + structure);
System.out.println("Full Content:\n" + content);
}
public void write(String newContent, boolean addSignatureIfMissing) throws IOException {
if (addSignatureIfMissing && !newContent.startsWith("/*")) {
newContent = "/* REXX */\n" + newContent;
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filepath))) {
writer.write(newContent);
}
}
// Example usage:
// public static void main(String[] args) throws IOException {
// RexxFileHandler handler = new RexxFileHandler("example.rexx");
// handler.readAndDecode();
// handler.printProperties();
// handler.write("say \"Hello World\"", true);
// }
}
- JavaScript class for .REXX files (Node.js compatible):
const fs = require('fs');
class RexxFileHandler {
constructor(filepath) {
this.filepath = filepath;
this.extension = '.rexx';
this.mimeType = 'text/x-rexx';
this.encoding = 'utf-8'; // Assumed
this.lineEndings = null;
this.hasSignature = false;
this.content = '';
this.structure = 'REXX source code text';
}
readAndDecode() {
const raw = fs.readFileSync(this.filepath, this.encoding);
this.content = raw;
const lines = this.content.split(/\r?\n|\r/);
if (lines.length > 0) {
const firstLine = lines[0];
this.hasSignature = firstLine.startsWith('/*') && firstLine.toUpperCase().includes('REXX');
}
if (this.content.includes('\r\n')) {
this.lineEndings = 'CRLF';
} else if (this.content.includes('\r')) {
this.lineEndings = 'CR';
} else {
this.lineEndings = 'LF';
}
}
printProperties() {
console.log(`File Extension: ${this.extension}`);
console.log(`MIME Type: ${this.mimeType}`);
console.log(`Encoding: ${this.encoding}`);
console.log(`Line Endings: ${this.lineEndings}`);
console.log(`Signature Valid: ${this.hasSignature ? 'Yes' : 'No'}`);
console.log(`Content Structure: ${this.structure}`);
console.log(`Full Content:\n${this.content}`);
}
write(newContent, addSignatureIfMissing = true) {
if (addSignatureIfMissing && !newContent.startsWith('/*')) {
newContent = '/* REXX */\n' + newContent;
}
fs.writeFileSync(this.filepath, newContent, this.encoding);
}
}
// Example usage:
// const handler = new RexxFileHandler('example.rexx');
// handler.readAndDecode();
// handler.printProperties();
// handler.write('say "Hello World"');
- C "class" (using struct and functions) for .REXX files:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct {
char* filepath;
char* extension;
char* mime_type;
char* encoding;
char* line_endings;
bool has_signature;
char* content;
char* structure;
} RexxFileHandler;
RexxFileHandler* create_rexx_handler(const char* filepath) {
RexxFileHandler* handler = malloc(sizeof(RexxFileHandler));
handler->filepath = strdup(filepath);
handler->extension = ".rexx";
handler->mime_type = "text/x-rexx";
handler->encoding = "UTF-8"; // Assumed
handler->line_endings = NULL;
handler->has_signature = false;
handler->content = NULL;
handler->structure = "REXX source code text";
return handler;
}
void read_and_decode(RexxFileHandler* handler) {
FILE* file = fopen(handler->filepath, "rb");
if (!file) {
perror("Error opening file");
return;
}
fseek(file, 0, SEEK_END);
long size = ftell(file);
fseek(file, 0, SEEK_SET);
handler->content = malloc(size + 1);
fread(handler->content, 1, size, file);
handler->content[size] = '\0';
fclose(file);
// Find first line
char* first_line_end = strstr(handler->content, "\n");
if (!first_line_end) first_line_end = strstr(handler->content, "\r");
char first_line[1024];
if (first_line_end) {
strncpy(first_line, handler->content, first_line_end - handler->content);
first_line[first_line_end - handler->content] = '\0';
} else {
strcpy(first_line, handler->content);
}
// Check signature
char upper_first[1024];
strcpy(upper_first, first_line);
for (int i = 0; upper_first[i]; i++) upper_first[i] = toupper(upper_first[i]);
handler->has_signature = strncmp(first_line, "/*", 2) == 0 && strstr(upper_first, "REXX") != NULL;
// Detect line endings
if (strstr(handler->content, "\r\n")) {
handler->line_endings = "CRLF";
} else if (strstr(handler->content, "\r")) {
handler->line_endings = "CR";
} else {
handler->line_endings = "LF";
}
}
void print_properties(RexxFileHandler* handler) {
printf("File Extension: %s\n", handler->extension);
printf("MIME Type: %s\n", handler->mime_type);
printf("Encoding: %s\n", handler->encoding);
printf("Line Endings: %s\n", handler->line_endings);
printf("Signature Valid: %s\n", handler->has_signature ? "Yes" : "No");
printf("Content Structure: %s\n", handler->structure);
printf("Full Content:\n%s\n", handler->content);
}
void write_rexx(RexxFileHandler* handler, const char* new_content, bool add_signature_if_missing) {
char* content_to_write = strdup(new_content);
if (add_signature_if_missing && strncmp(new_content, "/*", 2) != 0) {
char* temp = malloc(strlen(new_content) + 12);
sprintf(temp, "/* REXX */\n%s", new_content);
free(content_to_write);
content_to_write = temp;
}
FILE* file = fopen(handler->filepath, "w");
if (!file) {
perror("Error writing file");
free(content_to_write);
return;
}
fprintf(file, "%s", content_to_write);
fclose(file);
free(content_to_write);
}
void destroy_rexx_handler(RexxFileHandler* handler) {
free(handler->filepath);
free(handler->content);
free(handler);
}
// Example usage:
// int main() {
// RexxFileHandler* handler = create_rexx_handler("example.rexx");
// read_and_decode(handler);
// print_properties(handler);
// write_rexx(handler, "say \"Hello World\"", true);
// destroy_rexx_handler(handler);
// return 0;
// }