/*
第2種情報処理技術者試験 平成11年度・春期・午後 問7
BohYoh Shibata PREPARATION
*/
#include <stdio.h>
#include <string.h>
#define F_FILE 2
#define F_DIRECTORY 1
#define F_UNMATCH 0
struct fentry {
char type;
char name[13];
long size;
struct fentry *next;
};
void flist(struct fentry *root, char *path_name)
{
struct fentry *fptr;
char path[512], *name_tbl[32], *cptr;
int idx, max, flag;
strcpy(path, path_name);
if (strcmp(path, "/") == 0) {
flag = F_DIRECTORY;
fptr = root;
}
else {
/* パス名の分解 */
idx = 0;
cptr = path;
while (*cptr != '\0') {
if (*cptr == '/') {
*cptr = '\0';
name_tbl[idx] = cptr + 1;
idx++;
}
cptr++;
}
max = idx - 1;
/* パス名の検索 */
fptr = root;
for (idx = 0; idx <= max; idx++) {
flag = F_UNMATCH;
while (fptr->type != 'E') {
if ( fptr->type != 'X' &&
strcmp(fptr->name, name_tbl[idx]) == 0) {
if (fptr->type == 'D') { /* ディレクトリ */
flag = F_DIRECTORY;
fptr = fptr->next;
break;
} else if (idx == max) { /* ファイル */
flag = F_FILE;
break;
} else
break; /* パス名の途中がファイルだった */
}
fptr++;
}
if (flag == F_UNMATCH)
break;
}
}
/* ファイル・ディレクトリの表示 */
switch (flag) {
case F_DIRECTORY:
while ( fptr->type != 'E' ) {
if (fptr->type == 'D')
printf("%s \tDirectory\n", fptr->name);
else if (fptr->type == 'F')
printf("%s \t%ld bytes\n", fptr->name, fptr->size);
fptr++;
}
break;
case F_FILE:
printf("%s \t%ld bytes\n", fptr->name, fptr->size);
break;
default:
printf("File or directory not found !!\n");
}
}