Mercurial > yaffs-ecoscentric-gpl
diff packages/fs/yaffs/current/src/ecos-yaffs-diriter.c @ 428:a386ed10401a ecos
Drop in eCos bridge work
| author | Ross Younger <wry@ecoscentric.com> |
|---|---|
| date | Fri, 14 May 2010 17:01:32 +0100 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/fs/yaffs/current/src/ecos-yaffs-diriter.c @@ -0,0 +1,89 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. + * + * Copyright (C) 2002-2010 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Charles Manning <charles@aleph1.co.uk> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +//============================================================================= +// +// ecos-yaffs-diriter.c +// +// Directory Iterator support for the eCos-YAFFS adaptation layer +// +//============================================================================= +// +//============================================================================= +//#####DESCRIPTIONBEGIN#### +// +// Author(s): wry +// Date: 2009-05-07 +// Note: This file is a derivative work of direct/yaffsfs.c and so +// should be taken as inheriting its license terms - hence the +// copyright banner above. +// +//####DESCRIPTIONEND#### +//============================================================================= + +#include "ecos-yaffs-diriter.h" +#include <cyg/infra/cyg_ass.h> + +// Directory operations -------------------------------------------------- + +struct ylist_head eyaffs_all_diriters; + +void eyaffs_diriter_advance(eyaffs_diriter *ctx) +{ + CYG_ASSERT(ctx && ctx->node && ctx->node->variantType == YAFFS_OBJECT_TYPE_DIRECTORY, "node not a directory"); + if ( !ctx->nextret ) return; // already finished, nothing to do + + struct ylist_head * top = &ctx->node->variant.directoryVariant.children; + + if (ylist_empty(top)) { + ctx->nextret = NULL; + return; + } + + struct ylist_head *next = ctx->nextret->siblings.next; + + if( next == top ) // finished + ctx->nextret = NULL; + else + ctx->nextret = ylist_entry(next,yaffs_Object,siblings); // works backwards from 'next' to its containing y_Object +} + +void eyaffs_diriter_rewind(eyaffs_diriter *ctx) +{ + CYG_ASSERT(ctx && ctx->node && ctx->node->variantType == YAFFS_OBJECT_TYPE_DIRECTORY, "node not a directory"); + + struct ylist_head * top = &ctx->node->variant.directoryVariant.children; + if (ylist_empty(top)) + ctx->nextret = NULL; + else + ctx->nextret = ylist_entry(top->next, yaffs_Object, siblings); +} + +void eyaffs_diriter_objremove_callback(yaffs_Object *obj) +{ + struct ylist_head *i; + eyaffs_diriter *cur; + + if(!eyaffs_all_diriters.next) return; // nothing to do + + ylist_for_each(i, &eyaffs_all_diriters) { // foreach ($i) @eyaffs_all_diriters + if (i) { + // 'i' points to the 'iterlist' member of an eyaffs_diriter, sort out cur to point to it + cur = ylist_entry(i, eyaffs_diriter, iterlist); + + if(cur->nextret == obj) // then fix it up + eyaffs_diriter_advance(cur); + } + } +} +
