- bump libtomcrypt
- SetFile -a "support"
- Date command.
This commit is contained in:
Kelvin Sherlock 2022-10-10 22:56:11 -04:00
parent 58c8cb758e
commit 77d807fbf9
11 changed files with 502 additions and 86 deletions

152
Date-flags.c Normal file
View File

@ -0,0 +1,152 @@
#ifdef __ORCAC__
#pragma optimize 79
#pragma noroot
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Date-flags.h"
void FlagsHelp(void)
{
fputs("Date [options]\n", stdout);
fputs("-a abbreviated date (e.g. Wed, Jun 14, 1995)\n", stdout);
fputs("-s short date (e.g. 6/14/95)\n", stdout);
fputs("-s4 short date, using 4-digit year (e.g. 6/14/1995)\n", stdout);
fputs("-u uniform output format, \1YYYY-MM-DD HH:MM:SS\1\n", stdout);
fputs("-st omit seconds from time format\n", stdout);
fputs("-d write date only\n", stdout);
fputs("-t write time only\n", stdout);
fputs("-c seconds write date corresponding to seconds\n", stdout);
fputs("-x date write seconds corresponding to date\n", stdout);
fputs("-n write seconds since January 1, 1904\n", stdout);
fputs("-utc write output converted to Universal Time Coordinates\n", stdout);
fputs("\n", stdout);
exit(0);
}
struct Flags flags;
int FlagsParse(int argc, char **argv)
{
char *cp;
char *optarg;
char c;
int i;
int j;
int eof; // end-of-flags
int mindex; // mutation index.
memset(&flags, 0, sizeof(flags));
for (i = 1, mindex = 1, eof = 0; i < argc; ++i) {
cp = argv[i];
c = cp[0];
if (c != '-' || eof) {
if (i != mindex) argv[mindex] = argv[i];
mindex++;
continue;
}
// -- = end of options.
if (cp[1] == '-' && cp[2] == 0) {
eof = 1;
continue;
}
if (!strcasecmp("s4", cp+1)) {
flags._s4 = 1;
continue;
}
if (!strcasecmp("st", cp+1)) {
flags._st = 1;
continue;
}
if (!strcasecmp("utc", cp+1)) {
flags._utc = 1;
continue;
}
// now scan all the flags in the string...
optarg = NULL;
for (j = 1; ; ++j) {
c = cp[j];
if (c == 0) break;
switch (c) {
case 'h':
FlagsHelp();
exit(0);
case 'a':
case 'A':
flags._a = 1;
break;
case 'c':
case 'C':
// -xarg or -x arg
++j;
if (cp[j]) {
optarg = cp + j;
}
else {
if (++i >= argc) {
fputs("### Date - \"-c\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
}
flags._c = optarg;
break;
case 'd':
case 'D':
flags._d = 1;
break;
case 'n':
case 'N':
flags._n = 1;
break;
case 's':
case 'S':
flags._s = 1;
break;
case 't':
case 'T':
flags._t = 1;
break;
case 'u':
case 'U':
flags._u = 1;
break;
case 'x':
case 'X':
// -xarg or -x arg
++j;
if (cp[j]) {
optarg = cp + j;
}
else {
if (++i >= argc) {
fputs("### Date - \"-x\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
}
flags._x = optarg;
break;
default:
fprintf(stderr, "### Date - \"-%c\" is not an option.\n", c);
exit(1);
}
if (optarg) break;
}
}
return mindex;
}

29
Date-flags.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef __flags_h__
#define __flags_h__
typedef struct Flags {
char *_c;
char *_x;
unsigned _a:1;
unsigned _d:1;
unsigned _n:1;
unsigned _s:1;
unsigned _s4:1;
unsigned _st:1;
unsigned _t:1;
unsigned _u:1;
unsigned _utc:1;
} Flags;
extern struct Flags flags;
int FlagsParse(int argc, char **argv);
void FlagsHelp(void);
#endif

28
Date-flags.text Normal file
View File

@ -0,0 +1,28 @@
---
case_insensitive: true
name: Date
options:
- a
- c: { argument : true }
- d
- n
- s
- s4
- st
- t
- u
- utc
- x: { argument : true }
help:
- Date [options]
- -a abbreviated date (e.g. Wed, Jun 14, 1995)
- -s short date (e.g. 6/14/95)
- -s4 short date, using 4-digit year (e.g. 6/14/1995)
- -u uniform output format, "YYYY-MM-DD HH:MM:SS"
- -st omit seconds from time format
- -d write date only
- -t write time only
- -c seconds write date corresponding to seconds
- -x date write seconds corresponding to date
- -n write seconds since January 1, 1904
- -utc write output converted to Universal Time Coordinates

146
Date.c Normal file
View File

@ -0,0 +1,146 @@
#include <stdio.h>
#include <stdlib.h>
#include <DateTimeUtils.h>
#include "Date-flags.h"
/*
Date # write the date and time
Date ([-a | -s | -s4 | -u] [-st] [-d | -t] [-c seconds | -utc]) | ([-n] [-utc]) | [-x date] > date
-a # abbreviated date (e.g. Wed, Jun 14, 1995)
-s # short date (e.g. 6/14/95)
-s4 # short date, using 4-digit year (e.g. 6/14/1995)
-u # uniform output format, "YYYY◊MM◊DD HH:MM:SS"
-st # omit seconds from time format
-d # write date only
-t # write time only
-c seconds # write date corresponding to seconds
-x date # write seconds corresponding to date
-n # write seconds since January 1, 1904
-utc # write output converted to Universal Time Coordinates
*/
void conflict(void) {
fprintf(stderr, "### Date - Conflicting options were specified.\n");
FlagsHelp();
exit(1);
}
unsigned long parse_seconds(const char *cp) {
unsigned long rv;
char *end = NULL;
rv = strtoul(cp, &end, 10);
if (!end || *end) {
fprintf(stderr, "### Date - illegal number, %s, specified with the \"-c\" option\n", cp);
exit(1);
}
return rv;
}
unsigned long parse_date(const char *cp) {
/* easter egg? bug? return 42316544 on bad input
accepts mm/dd/yy hh:mm:ss
accepts yyyy-mm-dd hh:mm:ss as well,
but option-shift-v diamond instead of -
*/
// should use StringToDate, StringToTime....
fputs("### Date -x not supported (yet)\n", stderr);
return 0;
}
int main(int argc, char **argv) {
unsigned type = 0;
unsigned long now;
DateForm df = longDate;
unsigned i;
unsigned char ds[256+1];
unsigned char ts[256+1];
const char *sep;
argc = FlagsParse(argc, argv);
if (argc > 1) {
fputs("### Date - Too many parameters were specified.\n", stderr);
FlagsHelp();
return 1;
}
// ([-a | -s | -s4 | -u] [-st] [-d | -t] [-c seconds | -utc])
// ([-n] [-utc])
// [-x date]
if (flags._a + flags._s + flags._s4 + flags._u > 1) conflict();
if (flags._d + flags._t > 1) conflict();
if (flags._c && flags._utc) conflict();
if (flags._utc + flags._n > 1) conflict();
// utc allowed in 1 or 2, not 3.
if (flags._utc && flags._x) conflict();
type = 0;
if (flags._a | flags._s | flags._s4 | flags._u | flags._st | flags._d | flags._t)
type |= 1;
if (flags._c) type |= 1;
if (flags._n) type |= 2;
if (flags._x) type |= 4;
switch(type) {
case 0:
case 1:
case 2:
case 4:
break;
default:
conflict();
}
if (flags._x) {
printf("%lu", parse_date(flags._x));
return 0;
}
if (flags._c) {
now = parse_seconds(flags._c);
} else {
ReadDateTime(&now);
}
if (flags._n) {
/* just print seconds */
printf("%lu\n", now);
return 0;
}
if (flags._u) {
/* uniform format .... */
}
if (flags._a) df = abbrevDate;
if (flags._s) df = shortDate;
// SecondsToDate(now, &dt);
IUDateString(now, df, ds);
IUTimeString(now, flags._st ? 0 : 1, ts);
i = ds[0];
if (flags._t) i = 0;
ds[i+1] = 0;
i = ts[0];
if (flags._d) i = 0;
ts[i+1] = 0;
if (flags._d | flags._t) sep = "";
else sep = " ";
printf("%s%s%s\n", ds+1, sep, ts+1);
return 0;
}

View File

@ -91,7 +91,7 @@ int do_rename(const unsigned char *src, const unsigned char *dest) {
fprintf(stderr, "# %s\n", GetSysErrText(err, error_message));
return 2;
}
err = Rename((const unsigned char *)src, 0, (const unsigned char *)dest);
err = HRename(0, 0, src, dest);
if (err) {
fprintf(stderr, "### Rename - unable to rename %s to %s\n", src+1, dest+1);
fprintf(stderr, "# %s\n", GetSysErrText(err, error_message));

View File

@ -33,49 +33,41 @@ int FlagsParse(int argc, char **argv)
memset(&flags, 0, sizeof(flags));
for (i = 1, mindex = 1, eof = 0; i < argc; ++i)
{
for (i = 1, mindex = 1, eof = 0; i < argc; ++i) {
cp = argv[i];
c = cp[0];
if (c != '-' || eof)
{
if (c != '-' || eof) {
if (i != mindex) argv[mindex] = argv[i];
mindex++;
continue;
}
// -- = end of options.
if (cp[1] == '-' && cp[2] == 0)
{
if (cp[1] == '-' && cp[2] == 0) {
eof = 1;
continue;
}
// now scan all the flags in the string...
optarg = NULL;
for (j = 1; ; ++j)
{
for (j = 1; ; ++j) {
c = cp[j];
if (c == 0) break;
switch (c)
{
switch (c) {
case 'h':
FlagsHelp();
break;
exit(0);
case 'c':
// -xarg or -x arg
++j;
if (cp[j])
{
++j;
if (cp[j]) {
optarg = cp + j;
}
else
{
if (++i >= argc)
{
fputs("option requires an argument -- c\n", stderr);
else {
if (++i >= argc) {
fputs("### - \"-c\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
@ -85,16 +77,13 @@ int FlagsParse(int argc, char **argv)
break;
case 't':
// -xarg or -x arg
++j;
if (cp[j])
{
++j;
if (cp[j]) {
optarg = cp + j;
}
else
{
if (++i >= argc)
{
fputs("option requires an argument -- t\n", stderr);
else {
if (++i >= argc) {
fputs("### - \"-t\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
@ -104,31 +93,44 @@ int FlagsParse(int argc, char **argv)
break;
case 'm':
// -xarg or -x arg
++j;
if (cp[j])
{
++j;
if (cp[j]) {
optarg = cp + j;
}
else
{
if (++i >= argc)
{
fputs("option requires an argument -- m\n", stderr);
else {
if (++i >= argc) {
fputs("### - \"-m\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
}
flags._m = optarg;
break;
case 'a':
// -xarg or -x arg
++j;
if (cp[j]) {
optarg = cp + j;
}
else {
if (++i >= argc) {
fputs("### - \"-a\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
}
flags._a = optarg;
break;
default:
fprintf(stderr, "illegal option -- %c\n", c);
exit(1);
fprintf(stderr, "### - \"-%c\" is not an option.\n", c);
exit(1);
}
if (optarg) break;
}
}
}
return mindex;

View File

@ -6,6 +6,7 @@ typedef struct Flags {
char *_c;
char *_t;
char *_m;
char *_a;
} Flags;

View File

@ -98,7 +98,6 @@ int main(int argc, char **argv)
{
FInfo newFI;
int optind;
int ok;
int i;
@ -161,6 +160,35 @@ int main(int argc, char **argv)
if (flags._t) fi.fdType = newFI.fdType;
if (flags._c) fi.fdCreator = newFI.fdCreator;
if (flags._a) {
char *cp = flags._a;
while (*cp) {
static char *attr = "AaVvBbSsTtCcOoLlIiNnMmWwDd";
int offset;
char *pos;
char c = *cp++;
pos = strchr(attr, c);
if (pos == NULL) {
fprintf(stderr, "SetFile: %c is not a valid flag letter\n", c);
exit(1);
}
offset = (int)(pos - attr);
switch(offset) {
case 2: // 'V'
fi.fdFlags |= fInvisible;
break;
case 3: // 'v'
fi.fdFlags &= ~fInvisible;
break;
case 4: // 'B'
fi.fdFlags |= fHasBundle;
break;
case 5: // 'b'
fi.fdFlags &= ~fHasBundle;
break;
}
}
}
ok = SetFInfo((unsigned char *)buffer, 0, &fi);
if (ok != 0)

104
flags.rb
View File

@ -75,6 +75,7 @@ class Option
@char = hash['char'].to_s
@argument = hash['argument'] || false
@ignore = hash['ignore'] || false
@flag_name = hash['flag_name']
@flag_name = @flag_name.to_s if @flag_name
@ -89,18 +90,32 @@ class Option
raise "Invalid xor type: #{@xor}"
end
@long = @char.length > 1
@xor.map! { |x| x.to_s }
end
attr_reader :char, :xor, :argument
attr_reader :char, :xor, :argument, :long
def flag_name
return @flag_name if @flag_name
return self.class.flag_name(@char)
end
def field_type
return :optarg if @argument
return :null if @ignore
return :bit
end
def self.flag_name(char)
return '_' + @@map[char] if @@map[char]
if char.length > 1
name = char
name = '_' + name.gsub(/[^A-Za-z0-9_]/, '_')
name = name.gsub('/_+/', '_')
return name
end
return '_' + @@map[char] if @@map[char]
return '_' + char
end
@ -108,14 +123,14 @@ class Option
end
# better ARGF.
def argf_each
def argf_each
if ARGV.count > 0
ARGV.each {|file|
File.open(file, "r") {|io|
yield file, io
File.open(file, "r") {|io|
yield file, io
}
}
@ -173,15 +188,13 @@ argf_each {|filename, file|
else
raise "Unexpected data type: #{opt}"
end
opt['char'] = opt['char'].downcase if case_insensitive
Option.new(opt)
}
if case_insensitive
options.each {|opt|
opt.char.downcase!
}
end
long_options = options.select {|opt| opt.long }
long_options = long_options
#data[options] = options
# check for help?
@ -203,13 +216,13 @@ argf_each {|filename, file|
io.write(header_preamble)
# two passes - one with arguments, one without.
options.each {|opt|
if opt.argument
if opt.field_type == :optarg
io.printf(" char *%s;\n", opt.flag_name)
end
}
io.puts()
options.each {|opt|
if !opt.argument
if opt.field_type == :bit
io.printf(" unsigned %s:1;\n", opt.flag_name)
end
}
@ -219,6 +232,7 @@ argf_each {|filename, file|
io.close unless io == $stdout
# #puts options.to_yaml
# puts code.result(binding())
@ -261,41 +275,54 @@ int FlagsParse(int argc, char **argv)
memset(&flags, 0, sizeof(flags));
for (i = 1, mindex = 1, eof = 0; i < argc; ++i)
{
for (i = 1, mindex = 1, eof = 0; i < argc; ++i) {
cp = argv[i];
c = cp[0];
if (c != '-' || eof)
{
if (c != '-' || eof) {
if (i != mindex) argv[mindex] = argv[i];
mindex++;
continue;
}
// -- = end of options.
if (cp[1] == '-' && cp[2] == 0)
{
if (cp[1] == '-' && cp[2] == 0) {
eof = 1;
continue;
}
% long_options.each do |opt|
% flag_name = 'flags.' + opt.flag_name
% strcmp = case_insensitive ? 'strcasecmp' : 'strcmp'
if (!<%= strcmp %>("<%= opt.char %>", cp+1)) {
% case opt.field_type
% when :optarg
if (++i >= argc) {
fputs("### <%= name %> - \"-<%= opt.char %>\" requires an argument.\n", stderr);
exit(1);
}
<%= flag_name %> = argv[i];
% when :bit
<%= flag_name %> = 1;
% end
continue;
}
% end
// now scan all the flags in the string...
optarg = NULL;
for (j = 1; ; ++j)
{
for (j = 1; ; ++j) {
c = cp[j];
if (c == 0) break;
switch (c)
{
% if help && !options.find_index {|x| x.char == 'h' }
switch (c) {
% if help && !options.find_index {|x| x.char == 'h' }
case 'h':
FlagsHelp();
exit(0);
% end
% end
% #
% options.each do |opt|
% next if opt.long
case '<%= escape_cstr(opt.char) %>':
% if case_insensitive && opt.char =~ /^[a-z]$/
case '<%= escape_cstr(opt.char.upcase) %>':
@ -305,16 +332,13 @@ int FlagsParse(int argc, char **argv)
% #
% if opt.argument
// -xarg or -x arg
++j;
if (cp[j])
{
++j;
if (cp[j]) {
optarg = cp + j;
}
else
{
if (++i >= argc)
{
fputs("### <%= name %> - \"-<%= opt.char %>\" requires an argument.\n", stderr);
else {
if (++i >= argc) {
fputs("### <%= name %> - \"-<%= opt.char %>\" requires an argument.\n", stderr);
exit(1);
}
optarg = argv[i];
@ -334,11 +358,11 @@ int FlagsParse(int argc, char **argv)
default:
fprintf(stderr, "### <%= name %> - \"-%c\" is not an option.\n", c);
exit(1);
exit(1);
}
if (optarg) break;
}
}
}
return mindex;

@ -1 +1 @@
Subproject commit 0676c9aec7299f5c398d96cbbb64f7e38f67d73f
Subproject commit 9b65d46584f6d0aae770562903bfeaa57e734f3c

View File

@ -77,6 +77,12 @@ OverlayIIgs: OverlayIIgs.c.o OverlayIIgs-flags.c.o $(LIBRARIES)
Rename: Rename.c.o Rename-flags.c.o FileCommon.c.o $(LIBRARIES)
$(MPW) Link $(LDFLAGS) -o $@ $^ $(LIBS)
Date : Date.c.o Date-flags.c.o $(LIBRARIES)
$(MPW) Link $(LDFLAGS) -o $@ $^ $(LIBS)
LTC_H = libtomcrypt/src/hashes/
lib/libtomcrypt : \
$(LTC_H)/md2.c.o $(LTC_H)/md4.c.o $(LTC_H)/md5.c.o \