Show
Ignore:
Timestamp:
10/04/08 04:45:39 (6 years ago)
Author:
fujidig
Message:

* exist, bload を実装。
* ファイル読み込みのサンプルを追加

Location:
lang/javascript/hsp-on-js/trunk
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/hsp-on-js/trunk/samples.html

    r20489 r20657  
    88<title>HSP on JS</title> 
    99<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2/jquery.min.js"></script> 
    10 <script type="text/javascript" src="hsp-on-js-core-0.0.1.js" charset="utf-8"></script> 
     10<script type="text/javascript" src="hsp-on-js-core-0.0.2.js" charset="utf-8"></script> 
    1111<script type="text/javascript"> 
     12function XHRReadURL(url, success, error) { 
     13        var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 
     14        xhr.open("GET", url, true); 
     15        xhr.onreadystatechange = function(){ 
     16                if(xhr.readyState != 4) return; 
     17                if(200 <= xhr.status && xhr.status < 300) { 
     18                        setTimeout(function(){success(xhr)}, 0); 
     19                } else if(xhr.status) { 
     20                        setTimeout(function(){error(xhr)}, 0); 
     21                } 
     22        }; 
     23        xhr.send(null); 
     24        return xhr; 
     25} 
     26 
    1227with(HSPonJS) { 
    1328        Evaluator.prototype.disposeException = function disposeException(e) { 
     
    1732                        msg += this.getBuiltinFuncName(insn)||''; 
    1833                        msg += "\n"; 
    19                         msg += '--> '+(e.message||ErrorMessages[e.errcode]); 
     34                        msg += '--\x3e '+(e.message||ErrorMessages[e.errcode]); 
    2035                        alert(msg); 
    2136                        return; 
     
    3045                        return; 
    3146                } 
     47                if(e instanceof FileReadException) { 
     48                        var self = this; 
     49                        self.fileReadXHR = XHRReadURL( 
     50                                e.path, 
     51                                function(xhr){ 
     52                                        self.fileReadXHR = null; 
     53                                        self.catchHSPException(function(){ e.success.call(self, xhr.responseText); }); 
     54                                        self.pc ++; 
     55                                        self.evaluate(); 
     56                                }, 
     57                                function() { 
     58                                        self.fileReadXHR = null; 
     59                                        self.catchHSPException(function(){ e.error.call(self); }); 
     60                                        self.pc ++; 
     61                                        self.evaluate(); 
     62                                }); 
     63                        return; 
     64                } 
    3265                throw e; 
    3366        }; 
     
    3568                if(this.timeoutID != undefined) { 
    3669                        clearTimeout(this.timeoutID); 
     70                } 
     71                if(this.fileReadXHR) { 
     72                        this.fileReadXHR.abort(); 
     73                        this.fileReadXHR = null; 
    3774                } 
    3875        }; 
     
    5895$(function(){ 
    5996        var evaluators = []; 
     97        function quitEvaluator(i) { 
     98                if(evaluators[i]) { 
     99                        evaluators[i].quit(); 
     100                        evaluators[i] = null; 
     101                } 
     102        } 
    60103        $('textarea').each(function(i) { 
    61104                var textarea = this; 
     
    75118                        var script = textarea.value; 
    76119                        resultTextarea.value = ''; 
    77                         if(evaluators[i]) { 
    78                                 evaluators[i].quit(); 
    79                                 evaluators[i] = null; 
    80                         } 
     120                        quitEvaluator(i); 
    81121                        $.post('compile.cgi', {script: script}, function(jsonData){ 
    82122                                var data = eval('('+jsonData+')'); 
     
    89129                                var evaluator = new HSPonJS.Evaluator(axdata, sequence); 
    90130                                evaluator.resultTextarea = resultTextarea; 
    91                                 if(evaluators[i]) { 
    92                                         evaluators[i].quit(); 
    93                                         evaluators[i] = null; 
    94                                 } 
     131                                quitEvaluator(i); 
    95132                                evaluators[i] = evaluator; 
    96133                                resultTextarea.style.display = ''; 
     
    100137                }); 
    101138                $(resetButton).click(function(){ 
    102                         if(evaluators[i]) { 
    103                                 evaluators[i].quit(); 
    104                                 evaluators[i] = null; 
    105                         } 
     139                        quitEvaluator(i); 
    106140                        resultTextarea.style.display = 'none'; 
    107141                        resetButton.style.display = 'none'; 
     
    250284    } 
    251285    stop</textarea> 
     286<h2>ファイル読み込み</h2> 
     287<textarea cols="100" rows="10"> 
     288sdim buf, 10000 
     289bload "samples.html", buf // この HTML ファイル自身の内容を取得 
     290ins = instr(buf, 0, "&lt;h1") 
     291mes strmid(buf, ins, 100)</textarea> 
    252292<h2>使用ライブラリ</h2> 
    253293<ul> 
  • lang/javascript/hsp-on-js/trunk/src/builtin-funcs.js

    r20416 r20657  
    226226                return new IntValue(this.loopStack[this.loopStack.length - 1].cnt); 
    227227        }, 
     228        0x06: function strsize() { 
     229                return this.strsize; 
     230        }, 
    228231        0x07: function looplev() { 
    229232                return new IntValue(this.loopStack.length); 
     
    241244 
    242245BuiltinFuncs[Token.Type.INTCMD] = { 
     246        0x11: function exist(path) { 
     247                this.scanArgs(arguments, 's'); 
     248                path = path.toStrValue()._value; 
     249                throw new FileReadException( 
     250                        path, 
     251                        function(data) { this.strsize = new IntValue(data.length); }, 
     252                        function() { this.strsize = new IntValue(-1); }); 
     253        }, 
     254        0x16: function bload(path, v) { 
     255                this.scanArgs(arguments, 'sv'); 
     256                path = path.toStrValue()._value; 
     257                throw new FileReadException( 
     258                        path, 
     259                        function(data) { 
     260                                var size = v.getByteSize(); 
     261                                v.setbytes(0, CP932.encode(data).substr(0, size)); 
     262                        }, 
     263                        function() { 
     264                                throw new HSPError(ErrorCode.FILE_IO); 
     265                        }); 
     266        }, 
    243267        0x1a: function poke(v, offset, val) { 
    244268                this.scanArgs(arguments, 'vNN'); 
  • lang/javascript/hsp-on-js/trunk/src/cp932.js

    r20137 r20657  
    1212 
    1313        encode: function encode(str){ 
    14                 return str.replace(/[^\x00-\x7f]/g,function(s){ 
     14                return str.replace(/[^\x00-\xff]/g,function(s){ 
    1515                        var c=s.charCodeAt(0),m; 
    1616                        return 65376<c&&c<65440?String.fromCharCode(c-65216):(c=CP932.Table.indexOf(s))<0?"\x81\x45":String.fromCharCode((m=(c<8272?c:(c=CP932.Table.lastIndexOf(s)))/188|0)<31?m+129:m+193)+String.fromCharCode((c%=188)<63?c+64:c+65) 
  • lang/javascript/hsp-on-js/trunk/src/evaluator.js

    r20292 r20657  
    1313        this.refdval = new DoubleArray(); 
    1414        this.refstr = new StrArray(); 
     15        this.strsize = new IntValue(0); 
    1516        this.random = new VCRandom(); 
    1617} 
     
    2324                                this.dispatch(insn); 
    2425                        } 
     26                } catch(e) { 
     27                        if(!(e instanceof HSPException)) { 
     28                                throw e; 
     29                        } 
     30                        this.disposeException(e); 
     31                } 
     32        }, 
     33        catchHSPException: function catchHSPException(callback) { 
     34                try { 
     35                        callback(); 
    2536                } catch(e) { 
    2637                        if(!(e instanceof HSPException)) { 
  • lang/javascript/hsp-on-js/trunk/src/exception.js

    r20137 r20657  
    8989        "外部オブジェクトの呼び出しに失敗しました",         // 39 
    9090        "関数の戻り値が設定されていません。",                    // 40 
    91         "関数を命令として記述しています。¥n(HSP2から関数化された名前を使用している可能性があります)",                    // 41 
     91        "関数を命令として記述しています。\n(HSP2から関数化された名前を使用している可能性があります)",                    // 41 
    9292        "*" 
    9393]; 
     
    102102} 
    103103WaitException.prototype = new HSPException; 
     104 
     105function FileReadException(path, success, error) { 
     106        this.path = path; 
     107        this.success = success; 
     108        this.error = error; 
     109} 
     110FileReadException.prototype = new HSPException; 
     111 
    104112 
    105113function HSPError(errcode, message) { 
     
    116124        HSPonJS.WaitException = WaitException; 
    117125        HSPonJS.StopException = StopException; 
     126        HSPonJS.FileReadException = FileReadException; 
    118127        HSPonJS.HSPError = HSPError; 
    119128} 
  • lang/javascript/hsp-on-js/trunk/src/hsp-array.js

    r20320 r20657  
    102102                        this.setbyte(offset, bytesOffset + i, buf.charCodeAt(i)); 
    103103                } 
     104        }, 
     105        getByteSize: function getByteSize(offset) { 
     106                throw new HSPError(ErrorCode.UNSUPPORTED_FUNCTION, 
     107                                   VarTypeNames[this.getType()]+" 型はメモリ読み込みに対応していません");  
    104108        } 
    105109}; 
  • lang/javascript/hsp-on-js/trunk/src/int-array.js

    r20320 r20657  
    3636                value |= (val & 0xff) << (bytesOffset % 4 * 8); 
    3737                this.values[i] = new IntValue(value); 
     38        }, 
     39        getByteSize: function getByteSize(offset) { 
     40                return (this.values.length - offset) * 4; 
    3841        } 
    3942}); 
  • lang/javascript/hsp-on-js/trunk/src/str-array.js

    r20320 r20657  
    6565                } 
    6666                this.values[offset] = str.slice(0, bytesOffset) + buf + str.slice(bytesOffset + buf.length); 
     67        }, 
     68        getByteSize: function getByteSize(offset) { 
     69                return this.values[offset].length; 
    6770        } 
    6871}); 
  • lang/javascript/hsp-on-js/trunk/src/variable-agent.js

    r20320 r20657  
    9595                if(offset == null) throw new HSPError(ErrorCode.ARRAY_OVERFLOW); 
    9696                return this.variable.setbytes(offset, bytesOffset, buf); 
     97        }, 
     98        getByteSize: function getByteSize() { 
     99                var offset = this.variable.value.getOffset(this.indices); 
     100                if(offset == null) throw new HSPError(ErrorCode.ARRAY_OVERFLOW); 
     101                return this.variable.getByteSize(offset); 
    97102        } 
    98103}; 
  • lang/javascript/hsp-on-js/trunk/src/variable.js

    r20320 r20657  
    8686        setbytes: function setbytes(offset, bytesOffset, buf) { 
    8787                return this.value.setbytes(offset, bytesOffset, buf); 
     88        }, 
     89        getByteSize: function getByteSize(offset) { 
     90                return this.value.getByteSize(offset); 
    8891        } 
    8992};