summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch')
-rw-r--r--Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch609
1 files changed, 609 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch b/Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch
new file mode 100644
index 00000000000..071ba74f281
--- /dev/null
+++ b/Build/source/texk/web2c/pdftexdir/pdfstrcmp.ch
@@ -0,0 +1,609 @@
+% Copyright (c) 2005 Han Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh, <thanh@pdftex.org>
+%
+% This file is part of pdfTeX.
+%
+% pdfTeX is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+%
+% pdfTeX is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with pdfTeX; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+%
+% $Id: //depot/Build/source.development/TeX/texk/web2c/pdftexdir/pdftex.ch#163 $
+%
+% experimental patch to make \pdfstrcmp expandable
+%
+% put it after tex.pch
+%
+% x line numbers of file pdfetex-org.web before patch
+%
+%***********************************************************************
+
+@x 9388
+@d pdftex_last_item_codes = pdftex_first_rint_code + 10 {end of \pdfTeX's command codes}
+@y
+@d pdf_shell_escape_code = pdftex_first_rint_code + 11 {code for \.{\\pdfshellescape}}
+@d pdftex_last_item_codes = pdftex_first_rint_code + 11 {end of \pdfTeX's command codes}
+@z
+
+@x 9442
+primitive("pdfelapsedtime",last_item,elapsed_time_code);
+@!@:elapsed_time_}{\.{\\pdfelapsedtime} primitive@>
+@y
+primitive("pdfelapsedtime",last_item,elapsed_time_code);
+@!@:elapsed_time_}{\.{\\pdfelapsedtime} primitive@>
+primitive("pdfshellescape",last_item,pdf_shell_escape_code);
+@!@:elapsed_time_}{\.{\\pdfshellescape} primitive@>
+@z
+
+@x 9470
+ elapsed_time_code: print_esc("pdfelapsedtime");
+@y
+ elapsed_time_code: print_esc("pdfelapsedtime");
+ pdf_shell_escape_code: print_esc("pdfshellescape");
+@z
+
+@x 9561
+ elapsed_time_code: cur_val := get_microinterval;
+@y
+ elapsed_time_code: cur_val := get_microinterval;
+ pdf_shell_escape_code:
+ begin
+ if shell_enabled_p then cur_val := 1
+ else cur_val := 0;
+ end;
+@z
+
+@x 10332
+@d pdf_last_escaped_string_code = pdftex_first_expand_code + 7 {command code for \.{\\pdflastescapedstring}}
+@d pdf_last_escaped_name_code = pdftex_first_expand_code + 8 {command code for \.{\\pdflastescapename}}
+@y
+@d pdf_escape_string_code = pdftex_first_expand_code + 7 {command code for \.{\\pdfescapestring}}
+@d pdf_escape_name_code = pdftex_first_expand_code + 8 {command code for \.{\\pdfescapename}}
+@z
+
+@x 10336
+@d pdftex_convert_codes = pdftex_first_expand_code + 11 {end of \pdfTeX's command codes}
+@y
+@d pdf_strcmp_code = pdftex_first_expand_code + 11 {command code for \.{\\pdfstrcmp}}
+@d pdf_escape_hex_code = pdftex_first_expand_code + 12 {command code for \.{\\pdfescapehex}}
+@d pdf_unescape_hex_code = pdftex_first_expand_code + 13 {command code for \.{\\pdfunescapehex}}
+@d pdf_creation_date_code = pdftex_first_expand_code + 14 {command code for \.{\\pdfcreationdate}}
+@d pdf_file_mod_date_code = pdftex_first_expand_code + 15 {command code for \.{\\pdffilemoddate}}
+@d pdf_file_size_code = pdftex_first_expand_code + 16 {command code for \.{\\pdffilesize}}
+@d pdf_mdfive_sum_code = pdftex_first_expand_code + 17 {command code for \.{\\pdfmdfivesum}}
+@d pdf_file_dump_code = pdftex_first_expand_code + 18 {command code for \.{\\pdffiledump}}
+@d pdf_match_code = pdftex_first_expand_code + 19 {command code for \.{\\pdfmatch}}
+@d pdf_last_match_code = pdftex_first_expand_code + 20 {command code for \.{\\pdflastmatch}}
+@d pdftex_convert_codes = pdftex_first_expand_code + 21 {end of \pdfTeX's command codes}
+@z
+
+%***********************************************************************
+
+@x 10369
+primitive("pdflastescapedstring",convert,pdf_last_escaped_string_code);@/
+@!@:pdf_last_escaped_string_}{\.{\\pdflastescapedstring} primitive@>
+primitive("pdflastescapedname",convert,pdf_last_escaped_name_code);@/
+@!@:pdf_last_escaped_name_}{\.{\\pdflastescapedname} primitive@>
+@y
+primitive("pdfescapestring",convert,pdf_escape_string_code);@/
+@!@:pdf_escape_string_}{\.{\\pdfescapestring} primitive@>
+primitive("pdfescapename",convert,pdf_escape_name_code);@/
+@!@:pdf_escape_name_}{\.{\\pdfescapename} primitive@>
+primitive("pdfescapehex",convert,pdf_escape_hex_code);@/
+@!@:pdf_escape_hex_}{\.{\\pdfescapehex} primitive@>
+primitive("pdfunescapehex",convert,pdf_unescape_hex_code);@/
+@!@:pdf_unescape_hex_}{\.{\\pdfunescapehex} primitive@>
+primitive("pdfcreationdate",convert,pdf_creation_date_code);@/
+@!@:pdf_creation_date_}{\.{\\pdfcreationdate} primitive@>
+primitive("pdffilemoddate",convert,pdf_file_mod_date_code);@/
+@!@:pdf_file_mod_date_}{\.{\\pdffilemoddate} primitive@>
+primitive("pdffilesize",convert,pdf_file_size_code);@/
+@!@:pdf_file_size_}{\.{\\pdffilesize} primitive@>
+primitive("pdfmdfivesum",convert,pdf_mdfive_sum_code);@/
+@!@:pdf_mdfive_sum_}{\.{\\pdfmdfivesum} primitive@>
+primitive("pdffiledump",convert,pdf_file_dump_code);@/
+@!@:pdf_file_dump_}{\.{\\pdffiledump} primitive@>
+primitive("pdfmatch",convert,pdf_match_code);@/
+@!@:pdf_match_}{\.{\\pdfmatch} primitive@>
+primitive("pdflastmatch",convert,pdf_last_match_code);@/
+@!@:pdf_last_match_}{\.{\\pdflastmatch} primitive@>
+primitive("pdfstrcmp",convert,pdf_strcmp_code);@/
+@!@:pdf_strcmp_}{\.{\\pdfstrcmp} primitive@>
+@z
+
+%***********************************************************************
+
+@x 10394
+ pdf_last_escaped_string_code: print_esc("pdflastescapedstring");
+ pdf_last_escaped_name_code: print_esc("pdflastescapedname");
+@y
+ pdf_escape_string_code: print_esc("pdfescapestring");
+ pdf_escape_name_code: print_esc("pdfescapename");
+ pdf_escape_hex_code: print_esc("pdfescapehex");
+ pdf_unescape_hex_code: print_esc("pdfunescapehex");
+ pdf_creation_date_code: print_esc("pdfcreationdate");
+ pdf_file_mod_date_code: print_esc("pdffilemoddate");
+ pdf_file_size_code: print_esc("pdffilesize");
+ pdf_mdfive_sum_code: print_esc("pdfmdfivesum");
+ pdf_file_dump_code: print_esc("pdffiledump");
+ pdf_match_code: print_esc("pdfmatch");
+ pdf_last_match_code: print_esc("pdflastmatch");
+ pdf_strcmp_code: print_esc("pdfstrcmp");
+@z
+
+%***********************************************************************
+
+@x 10403
+@p procedure conv_toks;
+var old_setting:0..max_selector; {holds |selector| setting}
+p, q: pointer;
+@!c:number_code..job_name_code; {desired type of conversion}
+@!save_scanner_status:small_number; {|scanner_status| upon entry}
+@!b:pool_pointer; {base of temporary string}
+@!i, l: integer; {index to access escaped string or name}
+begin c:=cur_chr; @<Scan the argument for command |c|@>;
+old_setting:=selector; selector:=new_string; b:=pool_ptr;
+@<Print the result of command |c|@>;
+selector:=old_setting; link(garbage):=str_toks(b); ins_list(link(temp_head));
+end;
+@y
+@p procedure conv_toks;
+label exit;
+var old_setting:0..max_selector; {holds |selector| setting}
+p, q: pointer;
+@!c:number_code..job_name_code; {desired type of conversion}
+@!save_scanner_status:small_number; {|scanner_status| upon entry}
+@!save_def_ref: pointer; {|def_ref| upon entry, important if inside `\.{\\message}'}
+@!save_warning_index: pointer;
+@!bool: boolean; {temp boolean}
+@!i: integer; {first temp integer}
+@!j: integer; {second temp integer}
+@!b:pool_pointer; {base of temporary string}
+@!s: str_number; {first temp string}
+@!t: str_number; {second temp string}
+begin c:=cur_chr; @<Scan the argument for command |c|@>;
+old_setting:=selector; selector:=new_string; b:=pool_ptr;
+@<Print the result of command |c|@>;
+selector:=old_setting; link(garbage):=str_toks(b); ins_list(link(temp_head));
+exit:end;
+@z
+
+@x 10450
+pdf_last_escaped_string_code: do_nothing;
+pdf_last_escaped_name_code: do_nothing;
+job_name_code: if job_name=0 then open_log_file;
+@y
+pdf_escape_string_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ escapestring(str_start[s]);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_escape_name_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ escapename(str_start[s]);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_escape_hex_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ escapehex(str_start[s]);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_unescape_hex_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ unescapehex(str_start[s]);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_creation_date_code:
+ begin
+ b := pool_ptr;
+ getcreationdate;
+ link(garbage) := str_toks(b);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_file_mod_date_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ getfilemoddate(s);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_file_size_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ getfilesize(s);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_mdfive_sum_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ bool := scan_keyword("file");
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ getmd5sum(s, bool);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_file_dump_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ {scan offset}
+ cur_val := 0;
+ if (scan_keyword("offset")) then begin
+ scan_int;
+ if (cur_val < 0) then begin
+ print_err("Bad file offset");
+@.Bad file offset@>
+ help2("A file offset must be between 0 and 2^{31}-1,")@/
+ ("I changed this one to zero.");
+ int_error(cur_val);
+ cur_val := 0;
+ end;
+ end;
+ i := cur_val;
+ {scan length}
+ cur_val := 0;
+ if (scan_keyword("length")) then begin
+ scan_int;
+ if (cur_val < 0) then begin
+ print_err("Bad dump length");
+@.Bad dump length@>
+ help2("A dump length must be between 0 and 2^{31}-1,")@/
+ ("I changed this one to zero.");
+ int_error(cur_val);
+ cur_val := 0;
+ end;
+ end;
+ j := cur_val;
+ {scan file name}
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ getfiledump(s, i, j);
+ link(garbage) := str_toks(b);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_match_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ {scan for icase}
+ bool := scan_keyword("icase");
+ {scan for subcount}
+ i := -1; {default for subcount}
+ if scan_keyword("subcount") then begin
+ scan_int;
+ i := cur_val;
+ end;
+ scan_pdf_ext_toks;
+ s := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ scan_pdf_ext_toks;
+ t := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ b := pool_ptr;
+ matchstrings(s, t, i, bool);
+ link(garbage) := str_toks(b);
+ flush_str(t);
+ flush_str(s);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_last_match_code:
+ begin
+ scan_int;
+ if cur_val < 0 then begin
+ print_err("Bad match number");
+@.Bad match number@>
+ help2("Since I expected zero or a positive number,")@/
+ ("I changed this one to zero.");
+ int_error(cur_val);
+ cur_val := 0;
+ end;
+ b := pool_ptr;
+ getmatch(cur_val);
+ link(garbage) := str_toks(b);
+ ins_list(link(temp_head));
+ return;
+ end;
+pdf_strcmp_code:
+ begin
+ save_scanner_status := scanner_status;
+ save_warning_index := warning_index;
+ save_def_ref := def_ref;
+ compare_strings;
+ def_ref := save_def_ref;
+ warning_index := save_warning_index;
+ scanner_status := save_scanner_status;
+ end;
+job_name_code: if job_name=0 then open_log_file;
+@z
+
+%***********************************************************************
+
+@x 10512
+pdf_last_escaped_string_code: begin
+ l := escapedstrlen;
+ for i := 0 to l - 1 do
+ print_char(getescapedstrchar(i));
+end;
+pdf_last_escaped_name_code: begin
+ l := escapednamelen;
+ for i := 0 to l - 1 do
+ print_char(getescapednamechar(i));
+end;
+job_name_code: print(job_name);
+@y
+pdf_strcmp_code: print_int(cur_val);
+job_name_code: print(job_name);
+@z
+
+%***********************************************************************
+
+@x 32168
+@d pdf_strcmp_code == pdftex_first_extension_code + 24
+@d pdf_escape_string_code == pdftex_first_extension_code + 25
+@d pdf_escape_name_code == pdftex_first_extension_code + 26
+@d reset_timer_code == pdftex_first_extension_code + 27
+@d pdf_font_expand_code == pdftex_first_extension_code + 28
+@d pdftex_last_extension_code == pdftex_first_extension_code + 28
+@y
+@d reset_timer_code == pdftex_first_extension_code + 24
+@d pdf_font_expand_code == pdftex_first_extension_code + 25
+@d pdftex_last_extension_code == pdftex_first_extension_code + 25
+@z
+
+%***********************************************************************
+
+@x 32239
+primitive("pdfstrcmp",extension,pdf_strcmp_code);@/
+@!@:pdf_strcmp_}{\.{\\pdfstrcmp} primitive@>
+primitive("pdfescapestring",extension,pdf_escape_string_code);@/
+@!@:pdf_escape_string_}{\.{\\pdfescapestring} primitive@>
+primitive("pdfescapename",extension,pdf_escape_name_code);@/
+@!@:pdf_escape_name_}{\.{\\pdfescapename} primitive@>
+@y
+@z
+
+%***********************************************************************
+
+@x 32287
+ pdf_strcmp_code: print_esc("pdfstrcmp");
+ pdf_escape_string_code: print_esc("pdfescapestring");
+ pdf_escape_name_code: print_esc("pdfescapename");
+@y
+@z
+
+%***********************************************************************
+
+@x 32337
+pdf_strcmp_code: @<Implement \.{\\pdfstrcmp}@>;
+pdf_escape_string_code: @<Implement \.{\\pdfescapestring}@>;
+pdf_escape_name_code: @<Implement \.{\\pdfescapename}@>;
+@y
+@z
+
+%***********************************************************************
+
+@x 32463
+procedure compare_strings; {to implement \.{\\pdfstrcmp}}
+label done;
+var s1, s2: str_number;
+ i1, i2, j1, j2: pool_pointer;
+ result: integer;
+begin
+ call_func(scan_toks(false, true));
+ s1 := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ call_func(scan_toks(false, true));
+ s2 := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ i1 := str_start[s1];
+ j1 := str_start[s1 + 1];
+ i2 := str_start[s2];
+ j2 := str_start[s2 + 1];
+ while (i1 < j1) and (i2 < j2) do begin
+ if str_pool[i1] < str_pool[i2] then begin
+ result := -1;
+ goto done;
+ end;
+ if str_pool[i1] > str_pool[i2] then begin
+ result := 1;
+ goto done;
+ end;
+ incr(i1);
+ incr(i2);
+ end;
+ if (i1 = j1) and (i2 = j2) then
+ result := 0
+ else if i1 < j1 then
+ result := 1
+ else
+ result := -1;
+done:
+ pdf_retval := result;
+ flush_str(s2);
+ flush_str(s1);
+end;
+@y
+procedure compare_strings; {to implement \.{\\pdfstrcmp}}
+label done;
+var s1, s2: str_number;
+ i1, i2, j1, j2: pool_pointer;
+begin
+ call_func(scan_toks(false, true));
+ s1 := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ call_func(scan_toks(false, true));
+ s2 := tokens_to_string(def_ref);
+ delete_token_ref(def_ref);
+ i1 := str_start[s1];
+ j1 := str_start[s1 + 1];
+ i2 := str_start[s2];
+ j2 := str_start[s2 + 1];
+ while (i1 < j1) and (i2 < j2) do begin
+ if str_pool[i1] < str_pool[i2] then begin
+ cur_val := -1;
+ goto done;
+ end;
+ if str_pool[i1] > str_pool[i2] then begin
+ cur_val := 1;
+ goto done;
+ end;
+ incr(i1);
+ incr(i2);
+ end;
+ if (i1 = j1) and (i2 = j2) then
+ cur_val := 0
+ else if i1 < j1 then
+ cur_val := 1
+ else
+ cur_val := -1;
+done:
+ flush_str(s2);
+ flush_str(s1);
+ cur_val_level := int_val;
+end;
+@z
+
+%***********************************************************************
+
+@x 33387
+@ @<Implement \.{\\pdfescapestring}@>=
+begin
+ scan_pdf_ext_toks;
+ escapestr(tokens_to_string(def_ref));
+ flush_str(last_tokens_string);
+ delete_token_ref(def_ref);
+end
+
+@ @<Implement \.{\\pdfescapename}@>=
+begin
+ scan_pdf_ext_toks;
+ escapename(tokens_to_string(def_ref));
+ flush_str(last_tokens_string);
+ delete_token_ref(def_ref);
+end
+@y
+@z
+
+@x 33406
+@ @<Implement \.{\\pdfstrcmp}@>=
+compare_strings
+@y
+@z
+
+@x 33409
+@ @<Set initial values of key variables@>=
+ seconds_and_micros(epochseconds,microseconds);
+@y
+@ @<Set initial values of key variables@>=
+ seconds_and_micros(epochseconds,microseconds);
+ init_start_time;
+@z
+
+%***********************************************************************