- add a socket timeout\r
- fix error postoning -- not all errors thrown by i/o code are\r
postponed\r
-- sbuf-hashcode\r
-- vector-hashcode\r
- some way to run httpd from command line\r
\r
+ bignums:\r
}
} //}}}
+ //{{{ hashCode() method
+ public int hashCode()
+ {
+ int hashCode = 0;
+ for(int i = 0; i < Math.min(top,4); i++)
+ {
+ Object obj = stack[i];
+ if(obj != null)
+ hashCode ^= obj.hashCode();
+ }
+
+ return hashCode;
+ } //}}}
+
//{{{ equals() method
public boolean equals(Object obj)
{
DEFER: str=
DEFER: str-hashcode
DEFER: sbuf=
+DEFER: sbuf-hashcode
DEFER: sbuf-clone
IN: files
sbuf-reverse
sbuf-clone
sbuf=
+ sbuf-hashcode
arithmetic-type
number?
>fixnum
[ drop 0 ]
[ drop 0 ]
[ drop 0 ]
- [ drop 0 ]
+ [ vector-hashcode ]
[ str-hashcode ]
- [ drop 0 ]
+ [ sbuf-hashcode ]
[ drop 0 ]
[ >fixnum ]
[ >fixnum ]
[ sbuf-reverse | " sbuf -- " ]
[ sbuf-clone | " sbuf -- sbuf " ]
[ sbuf= | " sbuf sbuf -- ? " ]
+ [ sbuf-hashcode | " sbuf -- n " ]
[ arithmetic-type | " n n -- type " ]
[ number? | " obj -- ? " ]
[ >fixnum | " n -- fixnum " ]
] [
2drop f
] ifte ;
+
+: ?vector-nth ( n vec -- obj/f )
+ 2dup vector-length >= [ 2drop f ] [ vector-nth ] ifte ;
+
+: vector-hashcode ( vec -- n )
+ 0 swap 4 [
+ over ?vector-nth hashcode rot bitxor swap
+ ] times* drop ;
] with-scope
] unit-test
-[ "<img src='/resource/library/icons/File.png'>" ]
+[ "<img src='/responder/resource/library/icons/File.png'>" ]
[
[
""
[ 12 ] [ 11 4 align ] unit-test
[ 12 ] [ 12 4 align ] unit-test
-[ 12 ] [ 10 2 align ] unit-test
+[ 10 ] [ 10 2 align ] unit-test
[ 14 ] [ 13 2 align ] unit-test
[ 11 ] [ 11 1 align ] unit-test
--- /dev/null
+IN: scratchpad
+USE: combinators
+USE: errors
+USE: kernel
+USE: logic
+USE: math
+USE: namespaces
+USE: stack
+USE: strings
+USE: test
+
+native? [
+ [ t ] [ "Foo" str>sbuf "Foo" str>sbuf = ] unit-test
+ [ f ] [ "Foo" str>sbuf "Foob" str>sbuf = ] unit-test
+ [ f ] [ 34 "Foo" str>sbuf = ] unit-test
+
+ [ "Hello" ] [
+ 100 <sbuf> "buf" set
+ "Hello" "buf" get sbuf-append
+ "buf" get clone "buf-clone" set
+ "World" "buf-clone" get sbuf-append
+ "buf" get sbuf>str
+ ] unit-test
+
+ [ t ] [
+ "Hello world" str>sbuf hashcode
+ "Hello world" hashcode =
+ ] unit-test
+] when
[ "fedcba" ] [ "abcdef" str-reverse ] unit-test
[ "edcba" ] [ "abcde" str-reverse ] unit-test
-native? [
- [ t ] [ "Foo" str>sbuf "Foo" str>sbuf = ] unit-test
- [ f ] [ "Foo" str>sbuf "Foob" str>sbuf = ] unit-test
- [ f ] [ 34 "Foo" str>sbuf = ] unit-test
-
- [ "Hello" ] [
- 100 <sbuf> "buf" set
- "Hello" "buf" get sbuf-append
- "buf" get clone "buf-clone" set
- "World" "buf-clone" get sbuf-append
- "buf" get sbuf>str
- ] unit-test
-] when
-
[ f ] [ [ 0 10 "hello" substring ] [ not ] catch ] unit-test
[ [ "hell" "o wo" "rld" ] ] [ 4 "hello world" split-n ] unit-test
"errors"
"hashtables"
"strings"
+ "sbuf"
"namespaces/namespaces"
"files"
"format"
[ list>vector [ 3 > ] vector-all? ] test-word
[ t ] [ [ ] ]
[ list>vector [ 3 > ] vector-all? ] test-word
+
+[ t ] [ { } hashcode { } hashcode = ] unit-test
+[ t ] [ { 1 2 3 } hashcode { 1 2 3 } hashcode = ] unit-test
+[ t ] [ { 1 { 2 } 3 } hashcode { 1 { 2 } 3 } hashcode = ] unit-test
+[ t ] [ { } hashcode { } hashcode = ] unit-test
primitive_sbuf_reverse,
primitive_sbuf_clone,
primitive_sbuf_eq,
+ primitive_sbuf_hashcode,
primitive_arithmetic_type,
primitive_numberp,
primitive_to_fixnum,
extern XT primitives[];
-#define PRIMITIVE_COUNT 192
+#define PRIMITIVE_COUNT 193
CELL primitive_to_xt(CELL primitive);
fixup_vector((VECTOR*)relocating);
break;
case STRING_TYPE:
- hash_string((STRING*)relocating);
+ rehash_string((STRING*)relocating);
break;
case SBUF_TYPE:
fixup_sbuf((SBUF*)relocating);
{
SBUF* sbuf = untag_sbuf(dpeek());
STRING* s = string_clone(sbuf->string,sbuf->top);
- hash_string(s);
+ rehash_string(s);
drepl(tag_object(s));
}
bool sbuf_eq(SBUF* s1, SBUF* s2)
{
- if(s1->top == s2->top)
+ if(s1 == s2)
+ return true;
+ else if(s1->top == s2->top)
return (string_compare_head(s1->string,s2->string,s1->top) == 0);
else
return false;
dpush(F);
}
+void primitive_sbuf_hashcode(void)
+{
+ SBUF* sbuf = untag_sbuf(dpop());
+ dpush(tag_fixnum(hash_string(sbuf->string,sbuf->top)));
+}
+
void fixup_sbuf(SBUF* sbuf)
{
sbuf->string = fixup_untagged_string(sbuf->string);
void primitive_sbuf_clone(void);
bool sbuf_eq(SBUF* s1, SBUF* s2);
void primitive_sbuf_eq(void);
+void primitive_sbuf_hashcode(void);
void fixup_sbuf(SBUF* sbuf);
void collect_sbuf(SBUF* sbuf);
}
/* call this after constructing a string */
-/* uses same algorithm as java.lang.String for compatibility */
-void hash_string(STRING* str)
+/* uses same algorithm as java.lang.String for compatibility with
+images generated from Java Factor. */
+FIXNUM hash_string(STRING* str, FIXNUM len)
{
FIXNUM hash = 0;
CELL i;
- for(i = 0; i < str->capacity; i++)
+ for(i = 0; i < len; i++)
hash = 31*hash + string_nth(str,i);
- str->hashcode = hash;
+ return hash;
+}
+
+void rehash_string(STRING* str)
+{
+ str->hashcode = hash_string(str,str->capacity);
}
/* untagged */
for(i = 0; i < capacity; i++)
cput(SREF(string,i),fill);
- hash_string(string);
+ rehash_string(string);
return string;
}
c_string++;
}
- hash_string(s);
+ rehash_string(s);
return s;
}
bool string_eq(STRING* s1, STRING* s2)
{
- if(s1->hashcode != s2->hashcode)
+ if(s1 == s2)
+ return true;
+ else if(s1->hashcode != s2->hashcode)
return false;
else
return (string_compare(s1,s2) == 0);
memcpy(result + 1,
(void*)((CELL)(string + 1) + CHARS * start),
CHARS * (end - start));
- hash_string(result);
+ rehash_string(result);
return result;
}
STRING* s = untag_string(dpeek());
s = string_clone(s,s->capacity);
string_reverse(s,s->capacity);
- hash_string(s);
+ rehash_string(s);
drepl(tag_object(s));
}
STRING* allot_string(FIXNUM capacity);
STRING* string(FIXNUM capacity, CELL fill);
-void hash_string(STRING* str);
+FIXNUM hash_string(STRING* str, FIXNUM len);
+void rehash_string(STRING* str);
STRING* grow_string(STRING* string, FIXNUM capacity, CHAR fill);
BYTE* to_c_string(STRING* s);
void box_c_string(const BYTE* c_string);