This is DirList.m in view mode; [Download] [Up]
#import "DirList.h"
#import <libc.h>
static const char *const *extlist = NULL;
static const char *getExt(const char *p)
{
int i, j;
const char *xt = NULL;
for (i = 0, j = -1; p[i]; i++)
if (p[i] == '.') j = i;
if (j <= 0) return NULL;
xt = &p[j + 1];
for (i = 0; extlist[i]; i++)
if (strcmp(extlist[i], xt) == 0) return xt;
return NULL;
}
static int NXstrcmp(const unsigned char *a, const unsigned char *b)
{
/* 040 sp a b c d e f g */
/* 050 h i j k l m n o */
/* 060 p q r s t u v w */
/* 070 x y z 0 1 2 3 4 */
/* 100 5 6 7 8 9 -- -- --*/
/* 110 -- ! " # $ % & ' */
/* 120 ( ) * + , - . / */
/* 130 -- -- : ; < = > ? */
/* 140 @ -- -- [ \ ] ^ _ */
/* 150 ` -- -- { | } ~ --*/
static unsigned char tab[96] =
/* 040 sp ! " # $ % & ' */ " IJKLMNO"
/* 050 ( ) * + , - . / */ "PQRSTUVW"
/* 060 0 1 2 3 4 5 6 7 */ ";<=>?@AB"
/* 070 8 9 : ; < = > ? */ "CDZ[\\]^_"
/* 100 @ A B C D E F G */ "`!\"#$%&\'"
/* 110 H I J K L M N O */ "()*+,-./"
/* 120 P Q R S T U V W */ "01234567"
/* 130 X Y Z [ \ ] ^ _ */ "89:cdefg"
/* 140 ` a b c d e f g */ "h!\"#$%&\'"
/* 150 h i j k l m n o */ "()*+,-./"
/* 160 p q r s t u v w */ "01234567"
/* 170 x y z { | } ~ del*/ "89:klmn\177";
int x, y;
for ( ; ; a++, b++) {
if ((x = *a) > ' ' || x < 0x7f) x = tab[x - ' '];
if ((y = *b) > ' ' || y < 0x7f) y = tab[y - ' '];
if ((x -= y) != 0)
return x;
if (!y) return 0;
}
}
static int NXalphasort(struct direct **d1, struct direct **d2)
{
return NXstrcmp((*d1)->d_name, (*d2)->d_name);
}
static int dirSelect(struct direct *d)
{
char *p = d->d_name;
if (p[0] == '.') {
if (p[1] == 0) return NO;
if (p[1] == '.' && p[2] == 0) return NO;
}
if (!extlist)
return YES;
return (getExt(p) != NULL);
}
@implementation DirList
+ setExtList: (const char *const *)list
{
extlist = list;
return self;
}
- init
{
namelist = NULL;
namelistNum = 0;
return self;
}
- free
{
if (namelist) {
int i;
for (i = 0; i < namelistNum; i++)
free((void *)namelist[i]);
free((void *)namelist);
namelist = NULL;
}
[super free];
return nil;
}
- (int)getDirList: (const char *)dirname
{
namelistNum = scandir(dirname, &namelist, dirSelect, NXalphasort);
return namelistNum;
}
- (int)fileNumber
{
return namelistNum;
}
- (const char *)filenameAt:(int)pos
{
return ((pos < namelistNum) ? namelist[pos]->d_name : NULL);
}
@end
#ifdef TESTALONE
int main(void)
{
id tmp;
int i, n;
static const char *const list[] = {
"h", "c", NULL };
[DirList setExtList: list];
tmp = [[DirList alloc] init];
n = [tmp getDirList:"."];
for (i = 0; i < n; i++)
printf("%2d %s\n", i, [tmp filenameAt: i]);
[tmp free];
return 0;
}
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.