summaryrefslogtreecommitdiff
path: root/riscos/filename.c
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-01-01 23:54:02 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-01-01 23:54:02 +0000
commit086046e4a3d2fc6d12fd774f5f098d2323e5cf2a (patch)
tree617c82a33fd761d464d4f24bef483f9aeeb505eb /riscos/filename.c
parentc50d851b43a9f144e353eb8139c7120fb9bb5804 (diff)
downloadnetsurf-086046e4a3d2fc6d12fd774f5f098d2323e5cf2a.tar.gz
netsurf-086046e4a3d2fc6d12fd774f5f098d2323e5cf2a.tar.bz2
[project @ 2006-01-01 23:54:02 by rjw]
Optimisation of filename requests. svn path=/import/netsurf/; revision=1930
Diffstat (limited to 'riscos/filename.c')
-rw-r--r--riscos/filename.c101
1 files changed, 49 insertions, 52 deletions
diff --git a/riscos/filename.c b/riscos/filename.c
index 808fbe6c4..f13d65550 100644
--- a/riscos/filename.c
+++ b/riscos/filename.c
@@ -20,8 +20,11 @@
#include "netsurf/utils/log.h"
#define FULL_WORD (unsigned int)4294967295
+/* '0' + '0' * 10 */
+#define START_PREFIX 528
struct directory {
+ int numeric_prefix; /** numeric representation of prefix */
char prefix[10]; /** directory prefix, eg '00.11.52.' */
unsigned int low_used; /** first 32 files, 1 bit per file */
unsigned int high_used; /** last 32 files, 1 bit per file */
@@ -80,17 +83,14 @@ char *ro_filename_request(void) {
* \return whether the claim was successful
*/
bool ro_filename_claim(const char *filename) {
- char *last;
- char dir_prefix[16];
- int i;
+ char dir_prefix[9];
+ int file;
struct directory *dir;
- /* extract the prefix */
- strcpy(dir_prefix, filename);
- for (i = 0, last = dir_prefix; i < 3; i++)
- while (*last && *last++ != '.');
- i = atoi(last);
- last[0] = '\0';
+ /* filename format is always '01.23.45.XX' */
+ strncpy(dir_prefix, filename, 8);
+ dir_prefix[9] = '\0';
+ file = (filename[10] + filename[9] * 10 - START_PREFIX);
/* create the directory */
dir = ro_filename_create_directory(dir_prefix);
@@ -98,14 +98,14 @@ bool ro_filename_claim(const char *filename) {
return false;
/* update the entry */
- if (i < 32) {
- if (dir->low_used & (1 << i))
+ if (file < 32) {
+ if (dir->low_used & (1 << file))
return false;
- dir->low_used |= (1 << i);
+ dir->low_used |= (1 << file);
} else {
- if (dir->high_used & (1 << (i - 32)))
+ if (dir->high_used & (1 << (file - 32)))
return false;
- dir->high_used |= (1 << (i - 32));
+ dir->high_used |= (1 << (file - 32));
}
return true;
}
@@ -117,25 +117,22 @@ bool ro_filename_claim(const char *filename) {
* \param filename the filename to release
*/
void ro_filename_release(const char *filename) {
- char *last;
- char dir_prefix[16];
- int i;
struct directory *dir;
-
- /* extract the prefix */
- sprintf(dir_prefix, filename);
- for (i = 0, last = dir_prefix; i < 3; i++)
- while (*last++ != '.');
- i = atoi(last);
- last[0] = '\0';
+ int index, file;
+
+ /* filename format is always '01.23.45.XX' */
+ index = ((filename[7] + filename[6] * 10 - START_PREFIX) |
+ ((filename[4] + filename[3] * 10 - START_PREFIX) << 6) |
+ ((filename[1] + filename[0] * 10 - START_PREFIX) << 12));
+ file = (filename[10] + filename[9] * 10 - START_PREFIX);
/* modify the correct directory entry */
for (dir = root; dir; dir = dir->next)
- if (!strcmp(dir->prefix, dir_prefix)) {
- if (i < 32)
- dir->low_used &= ~(1 << i);
+ if (dir->numeric_prefix == index) {
+ if (file < 32)
+ dir->low_used &= ~(1 << file);
else
- dir->high_used &= ~(1 << (i - 32));
+ dir->high_used &= ~(1 << (file - 32));
return;
}
}
@@ -174,45 +171,46 @@ void ro_filename_flush(void) {
*/
static struct directory *ro_filename_create_directory(const char *prefix) {
char *last_1, *last_2;
- int result, index;
+ int index;
struct directory *old_dir, *new_dir, *prev_dir = NULL;
char dir_prefix[16];
/* get the lowest unique prefix, or use the provided one */
if (!prefix) {
- sprintf(dir_prefix, "00.00.00.");
- for (index = 1, old_dir = root; old_dir;
- index++, old_dir = old_dir->next) {
- if (strcmp(old_dir->prefix, dir_prefix))
+ for (index = 0, old_dir = root; old_dir; index++,
+ prev_dir = old_dir, old_dir = old_dir->next)
+ if (old_dir->numeric_prefix != index)
break;
- sprintf(dir_prefix, "%.2i.%.2i.%.2i.",
- ((index >> 12) & 63),
- ((index >> 6) & 63),
- ((index >> 0) & 63));
- }
+ sprintf(dir_prefix, "%.2i.%.2i.%.2i.",
+ ((index >> 12) & 63),
+ ((index >> 6) & 63),
+ ((index >> 0) & 63));
prefix = dir_prefix;
+ } else {
+ /* prefix format is always '01.23.45.' */
+ index = ((prefix[7] + prefix[6] * 10 - START_PREFIX) |
+ ((prefix[4] + prefix[3] * 10 - START_PREFIX) << 6) |
+ ((prefix[1] + prefix[0] * 10 - START_PREFIX) << 12));
+ for (old_dir = root; old_dir; prev_dir = old_dir,
+ old_dir = old_dir->next) {
+ if (old_dir->numeric_prefix == index)
+ return old_dir;
+ else if (old_dir->numeric_prefix > index)
+ break;
+ }
}
/* allocate a new directory */
- new_dir = (struct directory *)calloc(1,
- sizeof(struct directory));
+ new_dir = (struct directory *)malloc(sizeof(struct directory));
if (!new_dir) {
- LOG(("No memory for calloc()"));
+ LOG(("No memory for malloc()"));
return NULL;
}
strncpy(new_dir->prefix, prefix, 9);
new_dir->prefix[9] = '\0';
+ new_dir->low_used = new_dir->high_used = 0;
+ new_dir->numeric_prefix = index;
- /* link into the tree, sorted by prefix. */
- for (old_dir = root; old_dir; prev_dir = old_dir,
- old_dir = old_dir->next) {
- result = strcmp(old_dir->prefix, prefix);
- if (result == 0) {
- free(new_dir);
- return old_dir;
- } else if (result > 0)
- break;
- }
if (!prev_dir) {
new_dir->next = root;
root = new_dir;
@@ -234,6 +232,5 @@ static struct directory *ro_filename_create_directory(const char *prefix) {
xosfile_create_dir(ro_filename_directory, 0);
}
}
-
return new_dir;
}