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.