JavaScript fgetc
Get a character from file pointer
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 3031 32 33 34 3536 37 38 39 4041 42 43 44 4546 47 48 49 5051 52 | function fgetc (handle) { // Get a character from file pointer // // version: 909.322 // discuss at: http://phpjs.org/functions/fgetc // + original by: Brett Zamir (http://brett-zamir.me) // * example 1: fopen('http://kevin.vanzonneveld.net/pj_test_supportfile_1.htm', 'r'); // * example 1: fgetc(handle); // * returns 1: '1' if (!this.php_js || !this.php_js.resourceData || !this.php_js.resourceDataPointer) { return false; } var start = this.php_js.resourceDataPointer[handle.id]; if (start === undefined || !this.php_js.resourceData[handle.id][start]) { return false; // Resource was already closed or already reached the end of the file } var length = 1; // 2 byte-character (or surrogate) this.php_js.resourceDataPointer[handle.id] += length; var chr = this.php_js.resourceData[handle.id].substr(start, length); // If don't want to treat surrogate pairs as single characters, can delete from here until the last line (return chr;) var nextChr = this.php_js.resourceData[handle.id].substr(start+1, 1); var prevChr = start === 0 ? false : this.php_js.resourceData[handle.id].substr(start-1, 1); var code = chr.charCodeAt(0); if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters) if (!nextChr) { throw 'High surrogate without following low surrogate (fgetc)'; } var next = nextChr.charCodeAt(0); if (0xDC00 > next || next > 0xDFFF) { throw 'High surrogate without following low surrogate (fgetc)'; } this.php_js.resourceDataPointer[handle.id] += length; // Need to increment counter again since grabbing next item return chr+nextChr; } else if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate if (prevChr === false) { throw 'Low surrogate without preceding high surrogate (fgetc)'; } var prev = prevChr.charCodeAt(0); if (0xD800 > prev || prev > 0xDBFF) { //(could change last hex to 0xDB7F to treat high private surrogates as single characters) throw 'Low surrogate without preceding high surrogate (fgetc)'; } return prevChr+chr; // Probably shouldn't have reached here, at least if traversing by fgetc() } return chr; } |
Examples
Running
1 2 | fopen('http://kevin.vanzonneveld.net/pj_test_supportfile_1.htm', 'r'); fgetc(handle); |
Should return
1 | '1' |
Dependencies
No dependencies, you can use this function standalone.
Open syntax issues
php.js uses JsLint to help us keep our code consistent and prevent some common bugs.
Eventually we want all code to pass or at least take into consideration most fixes suggested by JsLint, following this JsLint configuration we’ve decided on.
Authors
Thanks to the following developers, you get to have fgetc goodness in JavaScript.
No comments yet. Be the first!
spread the word:
Use any PHP function in JavaScript
These kind folks have already donated: Anonymous and Shawn Houser.
<your name here>