This is Exttab.m in view mode; [Download] [Up]
#import "Exttab.h"
#import <stdio.h>
#import <string.h>
#import "strfunc.h"
/*
Format:
<extension> <path_of_command> <args> ...
One of args must be '$', which is replaced by the image file.
If the first character of path is '~', it is extended to the home
directory. If '@', it is extended to the application directory.
Example...
jpg /usr/local/bin/djpeg $
g3 /usr/local/pbmplus/g3topbm -reversebits $
qwe ~/bin/qwe2ppm $ -
*/
#define MAXCOMM 512
static char *homeDir, *appDir;
static char *get_comm(const char *buf, int *a)
{
int i, j, n, len;
char tmp[MAXCOMM + 128], *p;
if ((len = strlen(buf)) < 3)
return NULL;
for (i = j = n = 0; i < len && buf[i]; ) {
while (buf[i] && buf[i] <= ' ') i++;
if (buf[i] > ' ') {
if (++n == 2) { /* path */
if (buf[i] == '~') p = homeDir;
else if (buf[i] == '@') p = appDir;
else p = NULL;
if (p) {
i++;
while (*p)
tmp[j++] = *p++;
}
}
while (buf[i] > ' ')
tmp[j++] = buf[i++];
tmp[j++] = 0;
}
}
*a = n;
tmp[j++] = 0; /* double NULL */
p = (char *)malloc(j);
for (i = 0; i < j; i++)
p[i] = tmp[i];
return p;
}
@implementation Exttab
- init
{
entry = 0;
table = NULL;
args = NULL;
homeDir = getenv("HOME");
appDir = str_dup(NXArgv[0]); /* alloc */
(void) dircopy(appDir, NXArgv[0], NO);
return self;
}
- (int)readExtData: (const char *)filename
{
FILE *fp;
char buf[MAXCOMM];
char **tab, *p;
int *a;
int count, newentry;
if ((fp = fopen(filename, "r")) == NULL)
return 0;
for (count = 0; fgets(buf, MAXCOMM, fp); )
if (buf[0] >= ' ' && buf[0] != '#') count++;
if (count == 0) {
fclose(fp);
return 0;
}
rewind(fp);
newentry = entry + count + 1;
tab = (char **)malloc(sizeof(char *) * newentry);
a = (int *)malloc(sizeof(int) * newentry);
for (count = 0; fgets(buf, MAXCOMM, fp); ) {
if (! (buf[0] >= ' ' && buf[0] != '#'))
continue;
if ((p = get_comm(buf, &a[count])) != NULL)
tab[count++] = p;
}
if (count == 0) {
free((void *)tab);
free((void *)a);
fclose(fp);
return 0;
}
if (entry > 0) {
int x, k = count;
for (x = 0; table[x]; x++) {
tab[k] = table[x];
a[k] = args[x];
k++;
}
free((void *)table);
free((void *)args);
entry = k;
}else
entry = count;
tab[entry] = NULL;
table = tab;
args = a;
return count;
}
- (char **)table
{
return table;
}
- (int)entry
{
return entry;
}
- (char **)execListAlloc: (const char *)type with: (const char *)filename
{
int i, n;
char **list, *p;
if (table == NULL)
return NULL;
for (n = 0; ; n++) {
if (table[n] == NULL) return NULL;
if (strcmp(table[n], type) == 0)
break;
}
list = (char **)malloc(sizeof(char *) * (args[n] + 1));
for (i = 1, p = table[n]; ; i++) {
while (*p) p++;
if (*++p == 0) { /* double NULL */
list[i] = NULL;
break;
}
list[i] = (*p == '$') ? (char *)filename : p;
}
p = list[0] = list[1];
while (*p) {
if (*p++ == '/')
list[1] = p;
}
return list;
}
@end
#ifdef TEST_ALONE
main()
{
id tab;
int i, n;
char **ex;
static char *sample[] = { "jpg", "g3", "none", NULL };
tab = [[Exttab alloc] init];
[tab readExtData: "./test1"];
[tab readExtData: "./test2"];
for (n = 0; sample[n]; n++) {
ex = [tab execListAlloc: sample[n] with: "ImageFile"];
if (ex == NULL) {
printf("Error\n");
continue;
}
for (i = 0; ex[i]; i++)
printf("(%s) ", ex[i]);
putchar('\n');
free((void *)ex);
}
}
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.