Decodificador incorporado
Um programa Postscript possui uma capacidade exclusiva (?) De ler o próprio texto do programa como dados. Este é normalmente utilizado pelo image
operador que recebe uma aquisição procedimento de dados como entrada, e este procedimento utiliza frequentemente currentfile
seguido por readline
, readstring
, ou readhexstring
. Mas, visto de outra maneira, image
é apenas mais um operador de loop, para que qualquer loop possa ler adiante . Um exemplo é o emulador de impressora de linha do Livro Verde.
O uso do token
operador chama o scanner em um arquivo ou sequência, retirando um número ou espaço - (ou não -: veja outra resposta) - nome delimitado.
Um simples intérprete PS no PS:
{currentfile token not {exit} if dup type /arraytype ne {exec} if }loop
Decodificador de cadeia de operador binário
Como não consigo fazer com que os tokens binários brutos funcionem para mim (veja outra resposta), usei a idéia de "decodificação incorporada" para explorar o mecanismo de token binário para empacotar o código em cadeias de caracteres de 8 bits e, em seguida, manipular e analisar os comandos da cadeia de caracteres em tempo real .
/.{
<920> % two-byte binary-encoded name template with 0x92 prefix
dup 1 4 3 roll put % insert number into string
cvx exec % and execute it
}def
/${
//. %the /. procedure body defined above
73 . %"forall" (by code number)
}def
O .
procedimento pega um número da pilha e o insere como o segundo byte em uma cadeia de dois bytes, o primeiro byte sendo o prefixo-byte de um token binário, especificando um nome de sistema executável. Salvamos um byte na cadeia de caracteres hexadecimal usando uma regra do scanner de que um número ímpar de petiscos na cadeia hexadecimal é preenchido com um petisco 0 adicional, de modo que 3 petiscos hexadecimais produzem uma cadeia de 2 bytes. A sequência é marcada como executável e chamada com a exec
qual chama o scanner, produz o nome do sistema executável desejado e, em seguida, carrega o nome e executa o operador. A $
faz isso em cada byte de uma cadeia na pilha, utilizando o .
procedimento duas vezes , uma vez que o corpo do laço, e, em seguida, executar o operador looping forall
, em número.
De forma mais compacta, esses procedimentos são assim:
/.{<920>dup 1 4 3 roll put cvx exec}def/${//. 73 .}def
%123457890123456789012345678901234567890123456789012345
% 1 2 3 4 5
Portanto, 55 caracteres compram seqüências de token binárias. Ou, para 6 caracteres (talvez 7, se você o encerrar com um espaço), você pode carregar a biblioteca G com a (G)run
qual define .
e $
como acima (+ algumas outras para estender o intervalo de códigos ascii-alcançáveis).
Mais ilustrado na minha resposta de palavras cruzadas .