mirror of
https://github.com/ksherlock/mpw.git
synced 2024-10-08 02:56:17 +00:00
SetFile Utility
This commit is contained in:
parent
fa92c2fca7
commit
db89554b31
102
Tools/SetFile-flags.c
Normal file
102
Tools/SetFile-flags.c
Normal file
@ -0,0 +1,102 @@
|
||||
|
||||
#ifdef __ORCAC__
|
||||
#pragma optimize 79
|
||||
#pragma noroot
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "SetFile-flags.h"
|
||||
|
||||
void FlagsHelp(void)
|
||||
{
|
||||
fputs("SetFile [options] file...\n", stdout);
|
||||
fputs("-c creator set the creator\n", stdout);
|
||||
fputs("-t type set the file type\n", stdout);
|
||||
fputs("\n", stdout);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
struct Flags flags;
|
||||
int FlagsParse(int argc, char **argv)
|
||||
{
|
||||
char *cp;
|
||||
char c;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
memset(&flags, 0, sizeof(flags));
|
||||
|
||||
for (i = 1; i < argc; ++i)
|
||||
{
|
||||
cp = argv[i];
|
||||
c = cp[0];
|
||||
|
||||
if (c != '-')
|
||||
return i;
|
||||
|
||||
// -- = end of options.
|
||||
if (cp[1] == '-' && cp[2] == 0)
|
||||
return i + 1;
|
||||
|
||||
// now scan all the flags in the string...
|
||||
for (j = 1; ; ++j)
|
||||
{
|
||||
int skip = 0;
|
||||
|
||||
c = cp[j];
|
||||
if (c == 0) break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'h':
|
||||
FlagsHelp();
|
||||
break;
|
||||
case 'c':
|
||||
// -xarg or -x arg
|
||||
skip = 1;
|
||||
if (cp[j + 1])
|
||||
{
|
||||
flags._c = cp + j + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++i >= argc)
|
||||
{
|
||||
fputs("option requires an argument -- c\n", stderr);
|
||||
return -1;
|
||||
}
|
||||
flags._c = argv[i];
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
// -xarg or -x arg
|
||||
skip = 1;
|
||||
if (cp[j + 1])
|
||||
{
|
||||
flags._t = cp + j + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++i >= argc)
|
||||
{
|
||||
fputs("option requires an argument -- t\n", stderr);
|
||||
return -1;
|
||||
}
|
||||
flags._t = argv[i];
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "illegal option -- %c\n", c);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (skip) break;
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
20
Tools/SetFile-flags.h
Normal file
20
Tools/SetFile-flags.h
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
#ifndef __flags_h__
|
||||
#define __flags_h__
|
||||
|
||||
typedef struct Flags {
|
||||
char *_c;
|
||||
char *_t;
|
||||
|
||||
|
||||
} Flags;
|
||||
|
||||
|
||||
extern struct Flags flags;
|
||||
|
||||
int FlagsParse(int argc, char **argv);
|
||||
|
||||
void FlagsHelp(void);
|
||||
|
||||
#endif
|
||||
|
10
Tools/SetFile-flags.text
Normal file
10
Tools/SetFile-flags.text
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
|
||||
options:
|
||||
- c: { argument : true }
|
||||
- t: { argument : true }
|
||||
|
||||
help:
|
||||
- SetFile [options] file...
|
||||
- -c creator set the creator
|
||||
- -t type set the file type
|
151
Tools/SetFile.c
Normal file
151
Tools/SetFile.c
Normal file
@ -0,0 +1,151 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <Finder.h>
|
||||
#include <Files.h>
|
||||
|
||||
#include "SetFile-flags.h"
|
||||
|
||||
|
||||
|
||||
int tox(char c)
|
||||
{
|
||||
c |= 0x20;
|
||||
if (c >='0' && c <= '9') return c - '0';
|
||||
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hex(const char *in, char *out, int length)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < length; ++i)
|
||||
{
|
||||
int tmp = 0;
|
||||
char c;
|
||||
|
||||
c = *in++;
|
||||
if (!isxdigit(c)) return -1;
|
||||
tmp |= tox(c) << 4;
|
||||
|
||||
c = *in++;
|
||||
if (!isxdigit(c)) return -1;
|
||||
tmp |= tox(c);
|
||||
|
||||
*out++ = tmp;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// convert the file/creators...
|
||||
// format:
|
||||
// 0x \xdigit{8}
|
||||
// $ \xdigit{8}
|
||||
// 4-cc code
|
||||
int checkcode(const char *in, char *out)
|
||||
{
|
||||
int length;
|
||||
|
||||
length = strlen(in);
|
||||
|
||||
if (length == 4)
|
||||
{
|
||||
// 4 cc code.
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i)
|
||||
out[i] = in[i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (length == 9 && in[0] == '$')
|
||||
return hex(in + 1, out, 4);
|
||||
|
||||
if (length ==10 && in[0] == '0' && in[1] == 'x')
|
||||
return hex(in + 2, out, 4);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
||||
FInfo newFI;
|
||||
int optind;
|
||||
int ok;
|
||||
int i;
|
||||
|
||||
|
||||
optind = FlagsParse(argc, argv);
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc == 0)
|
||||
{
|
||||
FlagsHelp();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
memset(&newFI, 0, sizeof(newFI));
|
||||
|
||||
if (!flags._t && !flags._c) return 0;
|
||||
|
||||
if (flags._t)
|
||||
{
|
||||
ok = checkcode(flags._t, (char *)&newFI.fdType);
|
||||
if (ok < 0)
|
||||
{
|
||||
fprintf(stderr, "SetFile: invalid file type: `%s`\n", flags._t);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags._c)
|
||||
{
|
||||
ok = checkcode(flags._c, (char *)&newFI.fdCreator);
|
||||
if (ok < 0)
|
||||
{
|
||||
fprintf(stderr, "SetFile: invalid creator type: `%s`\n", flags._c);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; ++i)
|
||||
{
|
||||
FInfo fi;
|
||||
char buffer[256];
|
||||
char *cp;
|
||||
int l;
|
||||
|
||||
cp = argv[i];
|
||||
l = strlen(cp);
|
||||
if (l > 255)
|
||||
{
|
||||
fprintf(stderr, "SetFile: %s: file name too long.\n", cp);
|
||||
continue;
|
||||
}
|
||||
|
||||
buffer[0] = l;
|
||||
memcpy(buffer + 1, cp, l);
|
||||
|
||||
memset(&fi, 0, sizeof(fi));
|
||||
|
||||
ok = GetFInfo((unsigned char *)buffer, 0, &fi);
|
||||
|
||||
if (flags._t) fi.fdType = newFI.fdType;
|
||||
if (flags._c) fi.fdCreator = newFI.fdCreator;
|
||||
|
||||
ok = SetFInfo((unsigned char *)buffer, 0, &fi);
|
||||
if (ok != 0)
|
||||
{
|
||||
fprintf(stderr, "SetFile: %s: unable to set finder info: %d\n", cp, ok);
|
||||
}
|
||||
}
|
||||
|
||||
exit(0);
|
||||
return 0;
|
||||
}
|
@ -12,7 +12,7 @@ LIBS = $(Libraries)/Stubs.o \
|
||||
LDFLAGS = -w -c 'MPS ' -t MPST \
|
||||
-sn STDIO=Main -sn INTENV=Main -sn %A5Init=Main
|
||||
|
||||
all: Help GetEnv Duplicate
|
||||
all: Help GetEnv Duplicate SetFile
|
||||
|
||||
GetEnv: GetEnv.c.o
|
||||
mpw Link $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
@ -24,6 +24,15 @@ Help: Help.c.o
|
||||
Duplicate: Duplicate.c.o
|
||||
mpw Link $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
|
||||
|
||||
SetFile: SetFile.c.o SetFile-flags.c.o
|
||||
mpw Link $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
|
||||
|
||||
#SetFile.c : SetFile.rl
|
||||
# ragel -G2 -p -m -o $@ $<
|
||||
|
||||
|
||||
%.c.o : %.c
|
||||
mpw SC -p $< -o $@
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user