true,
'indent_string'=>' ',
'indent_line_numbers'=>true,
'keyword_prefix'=>'',
'keyword_suffix'=>'',
'special_keyword_prefix'=>'',
'special_keyword_suffix'=>'',
'line_number_prefix'=>'',
'line_number_suffix'=>' ',
'string_prefix'=>'',
'string_suffix'=>'',
'line_prefix'=>'
',
'line_suffix'=>'
' . "\r\n",
'star_command_prefix'=>'',
'star_command_suffix'=>'',
'comment_prefix'=>'',
'assembly_prefix'=>'',
'assembly_suffix'=>'',
);
return $settings;
}
function decode_char($char) {
if ($char == ' ') return ' ';
if ($char == '<') return '<';
return $char;
}
function get_token_to_keyword_map() {
return array(
0x7F=>array('keyword'=>'OTHERWISE', 'indent'=>0, 'special'=>false),
0x80=>array('keyword'=>'AND', 'indent'=>0, 'special'=>false),
0x81=>array('keyword'=>'DIV', 'indent'=>0, 'special'=>false),
0x82=>array('keyword'=>'EOR', 'indent'=>0, 'special'=>false),
0x83=>array('keyword'=>'MOD', 'indent'=>0, 'special'=>false),
0x84=>array('keyword'=>'OR', 'indent'=>0, 'special'=>false),
0x85=>array('keyword'=>'ERROR', 'indent'=>0, 'special'=>false),
0x86=>array('keyword'=>'LINE', 'indent'=>0, 'special'=>false),
0x87=>array('keyword'=>'OFF', 'indent'=>0, 'special'=>false),
0x88=>array('keyword'=>'STEP', 'indent'=>0, 'special'=>false),
0x89=>array('keyword'=>'SPC', 'indent'=>0, 'special'=>false),
0x8A=>array('keyword'=>'TAB(', 'indent'=>0, 'special'=>false),
0x8B=>array('keyword'=>'ELSE', 'indent'=>0, 'special'=>false),
0x8C=>array('keyword'=>'THEN', 'indent'=>1, 'special'=>false),
0x8D=>array('keyword'=>'$LINE$', 'indent'=>0, 'special'=>false),
0x8E=>array('keyword'=>'OPENIN', 'indent'=>0, 'special'=>false),
0x8F=>array('keyword'=>'PTR', 'indent'=>0, 'special'=>false),
0x90=>array('keyword'=>'PAGE', 'indent'=>0, 'special'=>false),
0x91=>array('keyword'=>'TIME', 'indent'=>0, 'special'=>false),
0x92=>array('keyword'=>'LOMEM', 'indent'=>0, 'special'=>false),
0x93=>array('keyword'=>'HIMEM', 'indent'=>0, 'special'=>false),
0x94=>array('keyword'=>'ABS', 'indent'=>0, 'special'=>false),
0x95=>array('keyword'=>'ACS', 'indent'=>0, 'special'=>false),
0x96=>array('keyword'=>'ADVAL', 'indent'=>0, 'special'=>false),
0x97=>array('keyword'=>'ASC', 'indent'=>0, 'special'=>false),
0x98=>array('keyword'=>'ASN', 'indent'=>0, 'special'=>false),
0x99=>array('keyword'=>'ATN', 'indent'=>0, 'special'=>false),
0x9A=>array('keyword'=>'BGET', 'indent'=>0, 'special'=>false),
0x9B=>array('keyword'=>'COS', 'indent'=>0, 'special'=>false),
0x9C=>array('keyword'=>'COUNT', 'indent'=>0, 'special'=>false),
0x9D=>array('keyword'=>'DEG', 'indent'=>0, 'special'=>false),
0x9E=>array('keyword'=>'ERL', 'indent'=>0, 'special'=>false),
0x9F=>array('keyword'=>'ERR', 'indent'=>0, 'special'=>false),
0xA0=>array('keyword'=>'EVAL', 'indent'=>0, 'special'=>false),
0xA1=>array('keyword'=>'EXP', 'indent'=>0, 'special'=>false),
0xA2=>array('keyword'=>'EXT', 'indent'=>0, 'special'=>false),
0xA3=>array('keyword'=>'FALSE', 'indent'=>0, 'special'=>false),
0xA4=>array('keyword'=>'FN', 'indent'=>0, 'special'=>false),
0xA5=>array('keyword'=>'GET', 'indent'=>0, 'special'=>false),
0xA6=>array('keyword'=>'INKEY', 'indent'=>0, 'special'=>false),
0xA7=>array('keyword'=>'INSTR(', 'indent'=>0, 'special'=>false),
0xA8=>array('keyword'=>'INT', 'indent'=>0, 'special'=>false),
0xA9=>array('keyword'=>'LEN', 'indent'=>0, 'special'=>false),
0xAA=>array('keyword'=>'LN', 'indent'=>0, 'special'=>false),
0xAB=>array('keyword'=>'LOG', 'indent'=>0, 'special'=>false),
0xAC=>array('keyword'=>'NOT', 'indent'=>0, 'special'=>false),
0xAD=>array('keyword'=>'OPENUP', 'indent'=>0, 'special'=>false),
0xAE=>array('keyword'=>'OPENOUT', 'indent'=>0, 'special'=>false),
0xAF=>array('keyword'=>'PI', 'indent'=>0, 'special'=>false),
0xB0=>array('keyword'=>'POINT(', 'indent'=>0, 'special'=>false),
0xB1=>array('keyword'=>'POS', 'indent'=>0, 'special'=>false),
0xB2=>array('keyword'=>'RAD', 'indent'=>0, 'special'=>false),
0xB3=>array('keyword'=>'RND', 'indent'=>0, 'special'=>false),
0xB4=>array('keyword'=>'SGN', 'indent'=>0, 'special'=>false),
0xB5=>array('keyword'=>'SIN', 'indent'=>0, 'special'=>false),
0xB6=>array('keyword'=>'SQR', 'indent'=>0, 'special'=>false),
0xB7=>array('keyword'=>'TAN', 'indent'=>0, 'special'=>false),
0xB8=>array('keyword'=>'TO', 'indent'=>0, 'special'=>false),
0xB9=>array('keyword'=>'TRUE', 'indent'=>0, 'special'=>false),
0xBA=>array('keyword'=>'USR', 'indent'=>0, 'special'=>false),
0xBB=>array('keyword'=>'VAL', 'indent'=>0, 'special'=>false),
0xBC=>array('keyword'=>'VPOS', 'indent'=>0, 'special'=>false),
0xBD=>array('keyword'=>'CHR$', 'indent'=>0, 'special'=>false),
0xBE=>array('keyword'=>'GET$', 'indent'=>0, 'special'=>false),
0xBF=>array('keyword'=>'INKEY$', 'indent'=>0, 'special'=>false),
0xC0=>array('keyword'=>'LEFT$(', 'indent'=>0, 'special'=>false),
0xC1=>array('keyword'=>'MID$(', 'indent'=>0, 'special'=>false),
0xC2=>array('keyword'=>'RIGHT$(', 'indent'=>0, 'special'=>false),
0xC3=>array('keyword'=>'STR$', 'indent'=>0, 'special'=>false),
0xC4=>array('keyword'=>'STRING$(', 'indent'=>0, 'special'=>false),
0xC5=>array('keyword'=>'EOF', 'indent'=>0, 'special'=>false),
0xC6=>array('keyword'=>'SUM', 'indent'=>0, 'special'=>false),
0xC7=>array('keyword'=>'WHILE', 'indent'=>1, 'special'=>false),
0xC8=>array('keyword'=>'CASE', 'indent'=>1, 'special'=>false),
// 0xC9=>array('keyword'=>'WHEN', 'indent'=>1, 'special'=>false),
0xC9=>array('keyword'=>'WHEN', 'indent'=>0, 'special'=>false),
0xCA=>array('keyword'=>'OF', 'indent'=>0, 'special'=>false),
// 0xCB=>array('keyword'=>'ENDCASE', 'indent'=>-2, 'special'=>false),
0xCB=>array('keyword'=>'ENDCASE', 'indent'=>-1, 'special'=>false),
0xCC=>array('keyword'=>'OTHERWISE', 'indent'=>0, 'special'=>false),
0xCD=>array('keyword'=>'ENDIF', 'indent'=>-1, 'special'=>false),
0xCE=>array('keyword'=>'ENDWHILE', 'indent'=>-1, 'special'=>false),
0xCF=>array('keyword'=>'PTR', 'indent'=>0, 'special'=>false),
0xD0=>array('keyword'=>'PAGE', 'indent'=>0, 'special'=>false),
0xD1=>array('keyword'=>'TIME', 'indent'=>0, 'special'=>false),
0xD2=>array('keyword'=>'LOMEM', 'indent'=>0, 'special'=>false),
0xD3=>array('keyword'=>'HIMEM', 'indent'=>0, 'special'=>false),
0xD4=>array('keyword'=>'SOUND', 'indent'=>0, 'special'=>false),
0xD5=>array('keyword'=>'BPUT', 'indent'=>0, 'special'=>false),
0xD6=>array('keyword'=>'CALL', 'indent'=>0, 'special'=>false),
0xD7=>array('keyword'=>'CHAIN', 'indent'=>0, 'special'=>false),
0xD8=>array('keyword'=>'CLEAR', 'indent'=>0, 'special'=>false),
0xD9=>array('keyword'=>'CLOSE', 'indent'=>0, 'special'=>false),
0xDA=>array('keyword'=>'CLG', 'indent'=>0, 'special'=>false),
0xDB=>array('keyword'=>'CLS', 'indent'=>0, 'special'=>false),
0xDC=>array('keyword'=>'DATA', 'indent'=>0, 'special'=>false),
0xDD=>array('keyword'=>'DEF', 'indent'=>0, 'special'=>true),
0xDE=>array('keyword'=>'DIM', 'indent'=>0, 'special'=>false),
0xDF=>array('keyword'=>'DRAW', 'indent'=>0, 'special'=>false),
0xE0=>array('keyword'=>'END', 'indent'=>0, 'special'=>false),
0xE1=>array('keyword'=>'ENDPROC', 'indent'=>0, 'special'=>false),
0xE2=>array('keyword'=>'ENVELOPE', 'indent'=>0, 'special'=>false),
0xE3=>array('keyword'=>'FOR', 'indent'=>1, 'special'=>false),
0xE4=>array('keyword'=>'GOSUB', 'indent'=>0, 'special'=>false),
0xE5=>array('keyword'=>'GOTO', 'indent'=>0, 'special'=>false),
0xE6=>array('keyword'=>'GCOL', 'indent'=>0, 'special'=>false),
0xE7=>array('keyword'=>'IF', 'indent'=>0, 'special'=>false),
0xE8=>array('keyword'=>'INPUT', 'indent'=>0, 'special'=>false),
0xE9=>array('keyword'=>'LET', 'indent'=>0, 'special'=>false),
0xEA=>array('keyword'=>'LOCAL', 'indent'=>0, 'special'=>false),
0xEB=>array('keyword'=>'MODE', 'indent'=>0, 'special'=>false),
0xEC=>array('keyword'=>'MOVE', 'indent'=>0, 'special'=>false),
0xED=>array('keyword'=>'NEXT', 'indent'=>-1, 'special'=>false),
0xEE=>array('keyword'=>'ON', 'indent'=>0, 'special'=>false),
0xEF=>array('keyword'=>'VDU', 'indent'=>0, 'special'=>false),
0xF0=>array('keyword'=>'PLOT', 'indent'=>0, 'special'=>false),
0xF1=>array('keyword'=>'PRINT', 'indent'=>0, 'special'=>false),
0xF2=>array('keyword'=>'PROC', 'indent'=>0, 'special'=>false),
0xF3=>array('keyword'=>'READ', 'indent'=>0, 'special'=>false),
0xF4=>array('keyword'=>'REM', 'indent'=>0, 'special'=>false),
0xF5=>array('keyword'=>'REPEAT', 'indent'=>1, 'special'=>false),
0xF6=>array('keyword'=>'REPORT', 'indent'=>0, 'special'=>false),
0xF7=>array('keyword'=>'RESTORE', 'indent'=>0, 'special'=>false),
0xF8=>array('keyword'=>'RETURN', 'indent'=>0, 'special'=>false),
0xF9=>array('keyword'=>'RUN', 'indent'=>0, 'special'=>false),
0xFA=>array('keyword'=>'STOP', 'indent'=>0, 'special'=>false),
0xFB=>array('keyword'=>'COLOUR', 'indent'=>0, 'special'=>false),
0xFC=>array('keyword'=>'TRACE', 'indent'=>0, 'special'=>false),
0xFD=>array('keyword'=>'UNTIL', 'indent'=>-1, 'special'=>false),
0xFE=>array('keyword'=>'WIDTH', 'indent'=>0, 'special'=>false),
0xFF=>array('keyword'=>'OSCLI', 'indent'=>0, 'special'=>false),
0x01=>array('keyword'=>'CIRCLE', 'indent'=>0, 'special'=>false),
0x02=>array('keyword'=>'ELLIPSE', 'indent'=>0, 'special'=>false),
0x03=>array('keyword'=>'FILL', 'indent'=>0, 'special'=>false),
0x04=>array('keyword'=>'MOUSE', 'indent'=>0, 'special'=>false),
0x05=>array('keyword'=>'ORIGIN', 'indent'=>0, 'special'=>false),
0x06=>array('keyword'=>'QUIT', 'indent'=>0, 'special'=>false),
0x07=>array('keyword'=>'RECTANGLE', 'indent'=>0, 'special'=>false),
0x08=>array('keyword'=>'SWAP', 'indent'=>0, 'special'=>false),
0x09=>array('keyword'=>'SYS', 'indent'=>0, 'special'=>false),
0x0A=>array('keyword'=>'TINT', 'indent'=>0, 'special'=>false),
0x0B=>array('keyword'=>'WAIT', 'indent'=>0, 'special'=>false),
0x0C=>array('keyword'=>'INSTALL', 'indent'=>0, 'special'=>false),
0x0E=>array('keyword'=>'PRIVATE', 'indent'=>0, 'special'=>false),
0x0F=>array('keyword'=>'BY', 'indent'=>0, 'special'=>false),
0x10=>array('keyword'=>'EXIT', 'indent'=>0, 'special'=>false),
// TODO: add immediate tokens 18-1F
0x100=>array('keyword'=>'SUM', 'indent'=>0, 'special'=>false),
0x101=>array('keyword'=>'BEAT', 'indent'=>0, 'special'=>false),
0x102=>array('keyword'=>'ASK', 'indent'=>0, 'special'=>false),
0x103=>array('keyword'=>'ANSWER', 'indent'=>0, 'special'=>false),
0x104=>array('keyword'=>'SFOPENIN', 'indent'=>0, 'special'=>false),
0x105=>array('keyword'=>'SFOPENOUT', 'indent'=>0, 'special'=>false),
0x106=>array('keyword'=>'SFOPENUP', 'indent'=>0, 'special'=>false),
0x107=>array('keyword'=>'SFNAME$', 'indent'=>0, 'special'=>false),
0x108=>array('keyword'=>'MENU', 'indent'=>0, 'special'=>false),
0x120=>array('keyword'=>'APPEND', 'indent'=>0, 'special'=>false),
0x121=>array('keyword'=>'AUTO', 'indent'=>0, 'special'=>false),
0x122=>array('keyword'=>'CRUNCH', 'indent'=>0, 'special'=>false),
0x123=>array('keyword'=>'DELETE', 'indent'=>0, 'special'=>false),
0x124=>array('keyword'=>'EDIT', 'indent'=>0, 'special'=>false),
0x125=>array('keyword'=>'HELP', 'indent'=>0, 'special'=>false),
0x126=>array('keyword'=>'LIST', 'indent'=>0, 'special'=>false),
0x127=>array('keyword'=>'LOAD', 'indent'=>0, 'special'=>false),
0x128=>array('keyword'=>'LVAR', 'indent'=>0, 'special'=>false),
0x129=>array('keyword'=>'NEW', 'indent'=>0, 'special'=>false),
0x12A=>array('keyword'=>'OLD', 'indent'=>0, 'special'=>false),
0x12B=>array('keyword'=>'RENUMBER', 'indent'=>0, 'special'=>false),
0x12C=>array('keyword'=>'SAVE', 'indent'=>0, 'special'=>false),
0x12D=>array('keyword'=>'TEXTLOAD', 'indent'=>0, 'special'=>false),
0x12E=>array('keyword'=>'TEXTSAVE', 'indent'=>0, 'special'=>false),
0x12F=>array('keyword'=>'TWIN', 'indent'=>0, 'special'=>false),
0x130=>array('keyword'=>'TWINO', 'indent'=>0, 'special'=>false),
0x131=>array('keyword'=>'INSTALL', 'indent'=>0, 'special'=>false),
0x140=>array('keyword'=>'CASE', 'indent'=>1, 'special'=>false),
0x141=>array('keyword'=>'CIRCLE', 'indent'=>0, 'special'=>false),
0x142=>array('keyword'=>'FILL', 'indent'=>0, 'special'=>false),
0x143=>array('keyword'=>'ORIGIN', 'indent'=>0, 'special'=>false),
0x144=>array('keyword'=>'POINT', 'indent'=>0, 'special'=>false),
0x145=>array('keyword'=>'RECTANGLE', 'indent'=>0, 'special'=>false),
0x146=>array('keyword'=>'SWAP', 'indent'=>0, 'special'=>false),
0x147=>array('keyword'=>'WHILE', 'indent'=>1, 'special'=>false),
0x148=>array('keyword'=>'WAIT', 'indent'=>0, 'special'=>false),
0x149=>array('keyword'=>'MOUSE', 'indent'=>0, 'special'=>false),
0x14A=>array('keyword'=>'QUIT', 'indent'=>0, 'special'=>false),
0x14B=>array('keyword'=>'SYS', 'indent'=>0, 'special'=>false),
0x14C=>array('keyword'=>'INSTALL', 'indent'=>0, 'special'=>false),
0x14D=>array('keyword'=>'LIBRARY', 'indent'=>0, 'special'=>false),
0x14E=>array('keyword'=>'TINT', 'indent'=>0, 'special'=>false),
0x14F=>array('keyword'=>'ELLIPSE', 'indent'=>0, 'special'=>false),
0x150=>array('keyword'=>'BEATS', 'indent'=>0, 'special'=>false),
0x151=>array('keyword'=>'TEMPO', 'indent'=>0, 'special'=>false),
0x152=>array('keyword'=>'VOICES', 'indent'=>0, 'special'=>false),
0x153=>array('keyword'=>'VOICE', 'indent'=>0, 'special'=>false),
0x154=>array('keyword'=>'STEREO', 'indent'=>0, 'special'=>false),
0x155=>array('keyword'=>'OVERLAY', 'indent'=>0, 'special'=>false),
0x156=>array('keyword'=>'MANDEL', 'indent'=>0, 'special'=>false),
0x157=>array('keyword'=>'PRIVATE', 'indent'=>0, 'special'=>false),
0x158=>array('keyword'=>'EXIT', 'indent'=>0, 'special'=>false),
);
}
function detokenise($data, $source_file, $settings = null) {
if (!$settings) $settings = bbcbasic::get_detokeniser_settings('text');
$result = '';
$token_to_keyword_map = bbcbasic::get_token_to_keyword_map();
// Examine file to determine format
$i = 1;
$basic80 = false; // Initially assume Acorn BASIC
$line_length = unpack('C', $data[0]);
$line_length = $line_length[1];
if ($line_length != 13) {
$basic80 = true; // If first byte <> 13, must be Russell BASIC line length
$i = 0;
} else { // If first byte = 13, could be Acorn or 1/256 chance could be Russell line length
$line_length = unpack('C', $data[3]); // Look for Acorn line length or first byte of Russell line
$line_length = $line_length[1];
$line_length = unpack('C', $data[$line_length]);
$line_length = $line_length[1];
if ($line_length != 13) { // If length doesn't points to a , 65535/65536 chance it is Russell BASIC
$basic80 = true; // Close enough. :)
$i = 0;
}
}
$indent = 0;
$in_assembly = false;
$data_length = strlen($data);
for ($i = $i; $i < $data_length; ++$i) {
if ($basic80) {
// len, lo, hi, text, cr
$line_length = unpack('C', $data[$i++]);
$line_number = unpack('v', substr($data, $i, 2));
$i += 2;
$line_length = $line_length[1];
$line_number = $line_number[1];
} else {
// hi, lo, len, text, cr
$line_length = unpack('C', $data[$i++]);
$line_number = unpack('C', $data[$i++]);
$line_length = $line_length[1];
$line_number = $line_number[1];
$line_number = $line_number + 256 * $line_length;
$line_length = unpack('C', $data[$i++]);
$line_length = $line_length[1];
}
if ($line_length == 0 || $line_number == 0xFFFF) break; // # End-of-file.
$result .= $settings['line_prefix'];
$line_number_string = '';
if ($line_number != 0) {
$line_number_string = $line_number;
}
if ($settings['indent_line_numbers']) {
$line_number_indent = str_repeat($settings['html_entities'] ? ' ' : ' ', 5 - strlen($line_number_string));
$result .= $line_number_indent;
}
$result .= $settings['line_number_prefix'];
$result .= $line_number_string;
$result .= $settings['line_number_suffix'];
$working_line = '';
$old_indent = $indent;
$adjust = 0;
if ($in_assembly) $working_line .= $settings['assembly_prefix'];
$start_of_line = true;
for ($j = 0; $j < $line_length - 4; ++$j, ++$i) {
$token = $data[$i];
$token_byte = unpack('C', $token);
$token_byte = $token_byte[1];
if ($token == '"') {
$working_line .= $settings['string_prefix'];
$in_string = false;
$iO = $i; $jO = $j;
$chars_found = -1;
while ($j < $line_length - 4) {
if ($data[$i] == '"') {
$in_string ^= true;
}
$working_line .= bbcbasic::decode_char($data[$i]);
++$chars_found;
if (!$in_string) {
break;
}
++$i; ++$j;
}
$i = $iO + $chars_found; $j = $jO + $chars_found;
$working_line .= $settings['string_suffix'];
$start_of_line = false;
} else if ($start_of_line && $token == '*') {
$working_line .= $settings['star_command_prefix'];
for (; $j < $line_length - 4; ++$j, ++$i) {
$working_line .= bbcbasic::decode_char($data[$i]);
}
--$i; --$j;
$working_line .= $settings['star_command_suffix'];
$start_of_line = false;
} else if ($token_byte == 0xF4) {
$working_line .= $settings['comment_prefix'];
$working_line .= 'REM';
++$i; ++$j;
for (; $j < $line_length - 4; ++$j, ++$i) {
$working_line .= bbcbasic::decode_char($data[$i]);
}
--$i; --$j;
$working_line .= $settings['comment_suffix'];
$start_of_line = false;
} else if ($token == '[' && !$in_assembly) {
$working_line .= $settings['assembly_prefix'];
$working_line .= '[';
$in_assembly = true;
$start_of_line = false;
} else if ($token == ']' && $in_assembly) {
$working_line .= ']';
$working_line .= $settings['assembly_suffix'];
$in_assembly = false;
$start_of_line = false;
} else if ($token == ';' && $in_assembly) {
$working_line .= $settings['comment_prefix'];
$working_line .= $token;
++$i; ++$j;
for (; $j < $line_length - 4; ++$j, ++$i) {
$working_line .= bbcbasic::decode_char($data[$i]);
}
--$i; --$j;
$working_line .= $settings['comment_suffix'];
$start_of_line = false;
} else if ($token == ':') {
$working_line .= $token;
$start_of_line = true;
} else {
if ($token_byte >= 0xC6 && $token_byte <= 0xC8) { # two-byte tokens
$eln = unpack('C', substr($data, $i + 1, 1));
if ($eln[1] >= 0x8E && $eln[1] <= 0xAF) {
$token_byte = ($eln[1] - 0x8E + 0x100 + ($token_byte - 0xC6)*32);
$i++;
$line_length--;
}
}
if ($token_byte == 0xCC) { # RENUMBER, ELSE, OTHERWISE
if (!$basic80) $token_byte = 0x8B;
}
if ($token_byte == 0xCC || $token_byte == 0x7F) { # OTHERWISE
$indent = $old_indent - 1;
$adjust = 1;
}
if ($token_byte == 0xC8) { # LOAD or CASE
if (!$basic80) $token_byte = 0x127;
}
if ($token_byte == 0xCD) { # SAVE or ENDIF
$eln = unpack('C', substr($data, $i + 1, 1));
if ($eln[1] >= 0x20) $token_byte = 0x12C;
}
if ($token_byte == 0x8B) { # ELSE
$eln = unpack('C', substr($data, $i + 1, 1));
if ($eln[1] == 0x0D) {
$indent = $old_indent - 1;
$adjust = 1;
}
}
if ($token_byte == 0x8C) { # THEN
$eln = unpack('C', substr($data, $i + 1, 1));
if ($eln[1] != 0x0D) --$indent; # Single-line IF
}
if (array_key_exists($token_byte, $token_to_keyword_map)) {
$keyword = $token_to_keyword_map[$token_byte];
if ($keyword['keyword'] == '$LINE$') {
$eln = unpack('C3', substr($data, $i + 1, 3));
$encoded_line_number =
((($eln[1] ^ 0x54) & 0x30) << 2) |
((($eln[1] ^ 0x54) & 0x0C) << 12) |
($eln[2] & 0x3F) |
(($eln[3] & 0x3F) << 8);
$working_line .= $encoded_line_number;
$i += 3; $j += 3;
} else {
$working_line .= $keyword['special'] ? $settings['special_keyword_prefix'] : $settings['keyword_prefix'];
$keyword_name = $settings['html_entities'] ? htmlspecialchars($keyword['keyword'], ENT_QUOTES) : $keyword['keyword'];
$ends_with_paren = (substr($keyword_name, -1) == '(');
if ($ends_with_paren) {
$working_line .= substr($keyword_name, 0, -1);
} else {
$working_line .= $keyword_name;
}
$working_line .= $keyword['special'] ? $settings['special_keyword_suffix'] : $settings['keyword_suffix'];
if ($ends_with_paren) {
$working_line .= '(';
}
$indent += $keyword['indent'];
}
$start_of_line = false;
} else {
if ($token == ' ') {
$working_line .= ' ';
} else {
$working_line .= $settings['html_entities'] ? htmlspecialchars($token, ENT_QUOTES) : $token;
$start_of_line = false;
}
}
}
}
if ($in_assembly) $working_line .= $settings['assembly_suffix'];
$indent_amount = ($indent > $old_indent ? $old_indent : $indent);
for ($indent_i = 0; $indent_i < $indent_amount; ++$indent_i) {
$result .= $settings['indent_string'];
}
$indent = $indent + $adjust;
$result .= $working_line;
$result .= $settings['line_suffix'];
}
return $result;
}
}
?>