phpjs
Version:
86 lines (73 loc) • 3.17 kB
Markdown
---
layout: page
title: "JavaScript fgetc function"
comments: true
sharing: true
footer: true
alias:
- /functions/view/fgetc:773
- /functions/view/fgetc
- /functions/view/773
- /functions/fgetc:773
- /functions/773
---
<!-- Generated by Rakefile:build -->
A JavaScript equivalent of PHP's fgetc
{% codeblock filesystem/fgetc.js lang:js https://raw.github.com/kvz/phpjs/master/functions/filesystem/fgetc.js raw on github %}
function fgetc (handle) {
// http://kevin.vanzonneveld.net
// + 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;
}
{% endcodeblock %}
- [view on github](https://github.com/kvz/phpjs/blob/master/functions/filesystem/fgetc.js)
- [edit on github](https://github.com/kvz/phpjs/edit/master/functions/filesystem/fgetc.js)
### Example 1
This code
{% codeblock lang:js example %}
fopen('http://kevin.vanzonneveld.net/pj_test_supportfile_1.htm', 'r');
fgetc(handle);
{% endcodeblock %}
Should return
{% codeblock lang:js returns %}
'1'
{% endcodeblock %}
### Other PHP functions in the filesystem extension
{% render_partial _includes/custom/filesystem.html %}