whalesong/js-assembler/runtime-src/baselib-chars.js
2011-07-05 17:04:54 -04:00

75 lines
1.8 KiB
JavaScript

// Single characters
(function(baselib) {
var exports = {};
baselib.chars = exports;
// Chars
// Char: string -> Char
Char = function(val){
this.val = val;
};
// The characters less than 256 must be eq?, according to the
// documentation:
// http://docs.racket-lang.org/reference/characters.html
var _CharCache = {};
for (var i = 0; i < 256; i++) {
_CharCache[String.fromCharCode(i)] = new Char(String.fromCharCode(i));
}
// makeInstance: 1-character string -> Char
Char.makeInstance = function(val){
if (_CharCache[val]) {
return _CharCache[val];
}
return new Char(val);
};
Char.prototype.toString = function(cache) {
var code = this.val.charCodeAt(0);
var returnVal;
switch (code) {
case 0: returnVal = '#\\nul'; break;
case 8: returnVal = '#\\backspace'; break;
case 9: returnVal = '#\\tab'; break;
case 10: returnVal = '#\\newline'; break;
case 11: returnVal = '#\\vtab'; break;
case 12: returnVal = '#\\page'; break;
case 13: returnVal = '#\\return'; break;
case 20: returnVal = '#\\space'; break;
case 127: returnVal = '#\\rubout'; break;
default: if (code >= 32 && code <= 126) {
returnVal = ("#\\" + this.val);
}
else {
var numStr = code.toString(16).toUpperCase();
while (numStr.length < 4) {
numStr = '0' + numStr;
}
returnVal = ('#\\u' + numStr);
}
break;
}
return returnVal;
};
Char.prototype.toWrittenString = Char.prototype.toString;
Char.prototype.toDisplayedString = function (cache) {
return this.val;
};
Char.prototype.getValue = function() {
return this.val;
};
Char.prototype.equals = function(other, aUnionFind){
return other instanceof Char && this.val == other.val;
};
exports.Char = Char;
})(this['plt'].baselib);