aboutsummaryrefslogtreecommitdiff
path: root/src/alf.c
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2025-11-27 17:26:50 -0500
committerB. Watson <urchlay@slackware.uk>2025-11-27 17:26:50 -0500
commit8aec307634ac63cf88e77df0e48fde1de0649b03 (patch)
tree09ab1b41d242fe632a8ed916ba2dfd2f10c71b7e /src/alf.c
parent85770c4b5cb89a8a4420293a2a8b1f0cef851d7e (diff)
downloadunalf-8aec307634ac63cf88e77df0e48fde1de0649b03.tar.gz
-A (text file conversion) option for alf.
Diffstat (limited to 'src/alf.c')
-rw-r--r--src/alf.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/alf.c b/src/alf.c
index 9c25068..fb79fcf 100644
--- a/src/alf.c
+++ b/src/alf.c
@@ -30,6 +30,10 @@ unsigned int input_len, output_len, out_bitpos;
int opt_append = 0;
int opt_overwrite = 0;
+int opt_zerotime = 0;
+int opt_alftime = 0;
+int opt_gmtime = 0;
+int opt_txtconv = 0;
struct stat in_file_stat;
@@ -132,7 +136,10 @@ unsigned long get_msdos_date_time(void) {
int msdos_year;
u16 ms_date, ms_time;
- tm = localtime(&t);
+ if(opt_gmtime)
+ tm = gmtime(&t);
+ else
+ tm = localtime(&t);
msdos_year = tm->tm_year + 1900 - 1980;
@@ -143,17 +150,25 @@ unsigned long get_msdos_date_time(void) {
void create_header(void) {
char hdr_filename[13];
+ unsigned long time;
atarify_filename(hdr_filename);
printf("Crunching %s\n", hdr_filename);
+ if(opt_alftime)
+ time = 0x03130588;
+ else if(opt_zerotime)
+ time = 0;
+ else
+ time = get_msdos_date_time();
+
output_buf[0] = 0x1a;
output_buf[1] = 0x0f;
memset(&output_buf[3], 0x20, 13);
strncat((char *)&output_buf[2], hdr_filename, 13);
output_buf[14] = 0x00;
store_quad(15, 0); /* compressed size, fill in later */
- store_quad(19, get_msdos_date_time());
+ store_quad(19, time);
store_cksum();
store_quad(25, input_len);
output_len = 29;
@@ -292,6 +307,17 @@ void make_backup(void) {
rename(out_filename, bak);
}
+void convert_eols(void) {
+ int i;
+
+ for(i = 0; i < input_len; i++) {
+ if(input_buf[i] == '\n')
+ input_buf[i] = 0x9b;
+ else if(input_buf[i] == '\t')
+ input_buf[i] = 0x7f;
+ }
+}
+
void crunch_file(const char *filename) {
init_table();
@@ -309,6 +335,9 @@ void crunch_file(const char *filename) {
return;
}
+ if(opt_txtconv)
+ convert_eols();
+
output_len = 0;
fstat(fileno(in_file), &in_file_stat); /* for timestamp */
fclose(in_file);
@@ -366,10 +395,21 @@ int main(int argc, char **argv) {
/* don't let getopt() print error message for us. */
opterr = 0;
- while((opt = getopt(argc, argv, "aoV")) != -1) {
+ while((opt = getopt(argc, argv, "aAt:oV")) != -1) {
switch(opt) {
+ case 'A': opt_txtconv = 1; break;
case 'a': opt_append = 1; opt_overwrite = 1; break;
case 'o': opt_overwrite = 1; opt_append = 0; break;
+ case 't': opt_zerotime = opt_alftime = opt_gmtime = 0;
+ switch(*optarg) {
+ case 'z': opt_zerotime = 1; break;
+ case 'd': opt_alftime = 1; break;
+ case 'u': opt_gmtime = 1; break;
+ default:
+ fprintf(stderr, "%s: fatal: invalid -t suboption '-%c' (try -h or --help)\n", self, *optarg);
+ exit(1);
+ }
+ break;
case 'V': puts(VERSION); exit(0); break;
default:
fprintf(stderr, "%s: fatal: invalid option '-%c' (try -h or --help)\n", self, optopt);