/*
    第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");
    }
}