aboutsummaryrefslogtreecommitdiff
path: root/src/memory/ramfs.c
blob: cc66b4c07c7d6a0d6cb310afb588af4a62649b75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// driver for the read-only ramfs
// see makefs.c for details

#include <stdint.h>
#include "ramfs.h"

static int strcmp(char const *str1, char const *str2)
{
  while (1)
    {
      int c1 = (unsigned char) *str1, c2 = (unsigned char) *str2;
      
      if (!c1 && !c2)
	return 0;

      if (c1 != c2)
	return c1 - c2;

      str1++; str2++;
    }
}

static uint32_t strlen(char const *str1)
{
  uint32_t len = 0;

  while (str1[len])
    len++;

  return len;
}

static inline char *align4(char *addr)
{
  return (char*) (((uint32_t) addr - 1) & ~0b11) + 4;
}

int find_file(void *ramfs, char *filename, struct ramfile *buf)
{
  char *fs_file = ramfs;

  while (*fs_file)
    {
      uint32_t *fs_file_size = (uint32_t*)
	align4(fs_file + strlen(fs_file) + 1);
      
      char *fs_file_contents = (char*) (fs_file_size + 1);

      if (!strcmp(fs_file, filename))
	{
	  buf->file_size = *fs_file_size;

	  buf->file_name = fs_file;

	  buf->file_contents = fs_file_contents;
	  
	  return 0;
	}

      // move to the next file in ramfs
      fs_file = align4(fs_file_contents + *fs_file_size);
    }

  return -1; // reached end of ramfs; file not found
}