/* Initialise a static list */
+#ifdef LIST_HEAD
+#undef LIST_HEAD
+#endif
+
#define LIST_HEAD(name) \
struct list_head name = { &(name), &(name)}
#define Y_LOFF_T loff_t
#endif
+/* Some RTOSs (eg. VxWorks) need strnlen. */
+size_t strnlen(const char *s, size_t maxlen);
+
#define yaffs_strcat(a, b) strcat(a, b)
#define yaffs_strcpy(a, b) strcpy(a, b)
#define yaffs_strncpy(a, b, c) strncpy(a, b, c)
static inline loff_t swap_loff_t(loff_t lval)
{
- u32 vall = swap_u32((u32) (lval & 0xffffffff));
+ u32 vall = swap_u32(FSIZE_LOW(lval));
u32 valh;
if (sizeof(loff_t) == sizeof(u32))
return (loff_t) vall;
- valh = swap_u32((u32) ((lval >> 32) & 0xffffffff));
+ valh = swap_u32(FSIZE_HIGH(lval));
- return (loff_t)((((u64)vall) << 32) | valh);
+ return FSIZE_COMBINE(vall, valh); /*NB: h and l are swapped. */
}
+
+
struct yaffs_dev;
void yaffs_do_endian_s32(struct yaffs_dev *dev, s32 *val);
void yaffs_do_endian_u32(struct yaffs_dev *dev, u32 *val);
loff_t fsize,
int do_endian)
{
- oh->file_size_low = (fsize & 0xFFFFFFFF);
- oh->file_size_high = ((fsize >> 32) & 0xFFFFFFFF);
+ oh->file_size_low = FSIZE_LOW(fsize);
+
+ oh->file_size_high = FSIZE_HIGH(fsize);
if (do_endian) {
yaffs_do_endian_u32(dev, &oh->file_size_low);
yaffs_do_endian_u32 (dev, &low);
yaffs_do_endian_u32 (dev, &high);
}
- retval = (((loff_t) high) << 32) |
- (((loff_t) low) & 0xFFFFFFFF);
+ retval = FSIZE_COMBINE(high, low);
} else {
u32 low = oh->file_size_low;
int yaffs_find_chunk_in_file(struct yaffs_obj *in, int inode_chunk,
struct yaffs_ext_tags *tags);
+/*
+ * Define LOFF_T_32_BIT if a 32-bit LOFF_T is being used.
+ * Not serious if you get this wrong - you might just get some warnings.
+*/
+
+#ifdef LOFF_T_32_BIT
+#define FSIZE_LOW(fsize) (fsize)
+#define FSIZE_HIGH(fsize) 0
+#define FSIZE_COMBINE(high, low) (low)
+#else
+#define FSIZE_LOW(fsize) ((fsize) & 0xffffffff)
+#define FSIZE_HIGH(fsize)(((fsize) >> 32) & 0xffffffff)
+#define FSIZE_COMBINE(high, low) ((((loff_t) (high)) << 32) | \
+ (((loff_t) (low)) & 0xFFFFFFFF))
+#endif
+
+
#endif