//prompt interativo prisma feito em puro prisma com mais opções
//v 0.99 3 jan de 2017
//conf padrao:
_Cabecalho = _VERSAO .. ' linguagemprisma.br4.biz (jan, 2017)\
[ -a = ajuda, -m = manual, -v = versao, -s = sair] em: '.. sis.nome;
_Prompt1 = '>> ';
_Prompt2 = ' ... ';
_AUTOR = [[
prompt 1.0
Autor: Adalberto Amorim Felipe.
<linguagemprisma@gmail.com>
]]
//inicializando arquivo de preconfiguracao se houver
//nome deve ser prisma.ini
inicio
local arq_ini = 'prisma.ini';
local func = carreguearquivo(arq_ini);
local ret = '';
se func entao
ret, m = pchame(func);
vapara final_ini;
fim
arq_ini = '/usr/local/share/prisma/1.0/plib/prisma.ini';
func = carreguearquivo(arq_ini);
se func entao
ret, m = pchame(func);
vapara final_ini;
fim
arq_ini = args[0] .. '.ini'
func = carreguearquivo(arq_ini);
se func entao
ret, m = pchame(func);
vapara final_ini;
fim
::final_ini::
se nao ret entao imprima('Erro no arquivo ini:\n',arq_ini); imprima(m) fim;
func = nulo;
fim
local term = {};
se sis.nome == 'linux' entao
term = inclua'term';
senaose sis.nome =='win32' entao
inclua'win';
imprima = funcao (...)
//poe'';
para k , v em ipares{...} inicio
imprimaf(conv_c(v .. ' '));
fim
poe'';
fim
term = nulo;
fim
//funcoes para eliminar erro de compatibilidade de sistema
//se linux use term.
funcao mude_cor(core)
se sis.nome == 'linux' entao
term.defCorletra(term[core]);
fim
fim
funcao mude_padrao()
se sis.nome == 'linux' entao
term.defPadrao();
fim
fim
//trata dos parametros externos chamados junto com o programa em linha de comando.
funcao exec_opcao_externa(Args)
local arg = Args;
se string.corte(arg[1],1,1) == '-' entao
se arg[1] == '-e' entao
se arg[2] entao
local func, err = carregue(arg[2]);
se nao func entao
mude_cor('vermelho');
imprima(err);
mude_padrao();
senao
func();
fim
senao
imprima'Falta 2 parametro para -e: string'
fim
sis.saia(0);
senaose arg[1] == '-l' entao
se arg[2] entao
inclua(arg[2]);
senao
imprima'Falta 2 parametro para -e: string'
fim
senaose arg[1] == '-a' entao
imprima[[
------------ Ajuda ---------
-e string : executa string
-l biblioteca : carrega biblioteca.
-a : exibe ajuda
prog : executa programa prog.
]]
sis.saia(0);
senaose arg[1] == '-v' entao
mude_cor('verde');
imprima(_VERSAO);
mude_padrao();
sis.saia(0);
senao
mude_cor('vermelho');
imprima'argumento invalido, tente -a para ajuda'
mude_padrao();
sis.saia(1);
fim
senao
args = {};
local tab = { selecione(2 , tabela.desempacote(arg) ) }
tab[-1] = arg[0];
tab[0] = arg[1];
args = tab;
local func, err = carreguearquivo(arg[1]);//erro ja e uma funcao por isso usei err
se func entao
func(args);
se principal entao
principal(tab);
fim
senao
mude_cor('vermelho');
imprima( err );
mude_padrao();
fim
sis.saia(0);
fim
fim
se args[1] entao//args externos: prismaterm args ...
exec_opcao_externa(args);
fim
se sis.nome == 'linux' entao
local term = inclua'term' //para limpar tela, mudar cor e mudar posicao do texto.
term.defTitulo( _Cabecalho );//define titulo no terminal.
fim
funcao imprima_cab()
local corcab = _Cor_prompt ou 'verde';
se sis.nome == 'linux' entao
term.defCorletra(term[corcab]);
fim
imprima(_Cabecalho);
se sis.nome == 'linux' entao
term.defPadrao();
fim
fim
funcao principal(Args)
local tmp = '';
local cmd = '';
local multilinha = verdadeiro;
local ret = verdadeiro;
imprima_cab();//imprime o cabecalho
enquanto 1 inicio
se nao ret e incompleto(err) entao
cmd = cmd .. '\n' .. leia_cmd(_Prompt2);
senaose ret entao
cmd = leia_cmd(_Prompt1);
senao
imprima_erro(err);
cmd = leia_cmd(_Prompt1);
ret = verdadeiro; //forca nao imprimir mensagem erro novamente.
fim
se cmd:corte(1,1) == '-' entao
se cmd == '-a' entao
ajuda();
senaose cmd:apare() == '-v' entao
imprima( '', _VERSAO);
imprima( _AUTOR);
leia();
limpe_tela();
ret = verdadeiro;
senaose cmd:apare() == '-r' entao
se sis.nome == 'linux' entao
term.limpeTela();
senao
sis.execute'cls';
fim
imprima_cab();
ret = verdadeiro;
senaose cmd:apare() == '-l' entao
imprima( _Licenca);
leia();
limpe_tela();
ret = verdadeiro;
senaose cmd:apare() == '-m' entao
mude_cor('amarelo');
imprima( _Manual);
leia();
limpe_tela();
senaose cmd:apare() == '-s' entao
sis.saia(0);
senaose cmd:apare() == '-inicio' ou cmd:apare() == '-i' entao
// poe'Modo bloco iniciado [ -- = sair]';
local tmp, cmd2 = '', '';
enquanto 1 inicio
tmp = leia_cmd('.. ');
se tmp:apare() == '-fim' ou tmp:apare() == '--' entao quebre fim//quebra o laco enquanto.
cmd2 = cmd2 .. '\n' .. tmp
fim
ret, err = carregue(cmd2);
se ret entao ret() fim
se sis.nome == 'linux' entao term.ad_historico(cmd2) fim;
cmd = '';
senaose cmd:apare() == '-c' entao //modo calculadora, todo valor é computado e impresso.
poe'Modo calculadora iniciado [ -- = sair]';
local tmp = '';
enquanto 1 inicio
tmp = leia_cmd(' ');
se (tmp:apare() == '-c' ou tmp:apare() == '--') entao quebre; fim
tmp = ' ' .. tmp;
execute_imprima(tmp);
fim
senao
imprima"Opcao invalida tente -a para ajuda";
ret = verdadeiro;
fim
senaose cmd:corte(1,1) == '=' entao
execute_imprima( cmd );
senao
ret, err = carregue(cmd);
se ret entao
local x, err = pchame(ret);
se nao x entao
mude_cor('vermelho');
imprima(err);
mude_padrao();
fim
fim
se sis.nome == 'linux' e cmd <> nulo e cmd <> '' entao term.ad_historico(cmd) fim;
fim
fim
fim //fim principal();
//esta funcao soma as linhas se um comando nao estiver fechado
funcao incompleto(err)
local eof = '<eof>';
local len_eof = #eof;
local len_msg = #err;
local cmp = err:corte(len_msg - len_eof + 1, len_msg);
se cmp == eof entao
retorne verdadeiro
senao
retorne falso;
fim
fim
funcao ajuda()
// term.defCorfundo(term.branco);
se sis.nome == 'linux' entao
term.defCorletra(term.vermelho);
fim
imprima([[
----------- Ajuda ------------
-a : ajuda
-m : manual de uso
-v : versão
-r : limpa tela e reinicia o prompt
-i : abre um bloco multilinha
-s : sai do programa.
-c : modo calculadora.
-l : licença
-- : fecha: bloco ou modo calculadora.
[s = sai da ajuda/ ENTER = mostra exemplos ...] ]]);
local op = obt_opcao();
se op <> 's' e op <> 'S' entao
se sis.nome == 'linux' entao
sis.execute('clear');
term.defCorletra(term.amarelo);
senaose sis.nome == 'win32' entao
sis.execute('cls');
fim
imprima[[
-------------- Exemplos ----------
Obs.: exemplo de bloco:
--
funcao soma(a,b)
imprima(a+b)
fim
--
soma(3,5);
ou -inicio
funcao soma(a,b)
imprima(a+b)
fim
-fim
soma(3,5);
[s = sair/ ENTER para continuar ...] ]]
op = obt_opcao();
se op == 's' ou op == 'S' entao
vapara fim_exemplos;
fim
se sis.nome == 'linux' entao
sis.execute('clear');
term.defCorletra(term.amarelo);
senaose sis.nome == 'win32' entao
sis.execute('cls');
fim
imprima[[
-------------- Exemplos ----------
x = 1;
enquanto x <= 10 inicio
imprima(x)
fim
funcao soma(a,b)
retorne a+b;
fim
imprima( soma(32, 15);
[ ENTER para continuar ... ]
]]
leia();
fim //fim se op <> 's'
::fim_exemplos:: //rotulo para usar com o comando vapara (vá para...)
se sis.nome == 'linux' entao
term.defPadrao(); //volta ao normal.
fim
se sis.nome == 'linux' entao
term.limpeTela();
senao
sis.execute'cls';
fim
imprima_cab();
//imprimaf(_Prompt1);
ret = verdadeiro;
fim
funcao execute_imprima( cmd )
se sis.nome == 'linux' entao term.ad_historico(cmd) fim;
local cmd2 = cmd:corte(2, #cmd); //elimina o '='
local str = string.formate("imprima( %s )", cmd2);//imprima(3+2) por exemplo.
local ret, err = executestring(str);
se nao ret entao
imprima_erro(err);
fim
fim
funcao imprima_erro(err)
se sis.nome == 'linux' entao
term.defCorletra(term.vermelho);
fim
imprima(err);
se sis.nome == 'linux' entao
term.defPadrao();
fim
fim
funcao leia_cmd(str)
se sis.nome == 'linux' entao
local cmd = term.leia(str);
term.ad_historico(cmd);//ao apertar a tecla `cima' mostra o que foi digitado anteriormente.
retorne cmd;
senao
imprimaf(str);
retorne leia();
fim
fim
funcao limpe_tela()
se sis.nome == 'linux' entao
term.defPadrao(); //volta ao normal.
term.limpeTela();
senao
sis.execute'cls';
fim
imprima_cab();
fim
funcao obt_opcao(cc)
local cc = cc ou '>';
imprimaf('\n%s',cc);
local op = '';
se sis.nome == 'linux' entao
op = term.obtcar();//nao precisa pressionar enter, retorna um caractere por vez em numero.
op = car(op);//converte de numero para car.
senao
op = leia();
fim
retorne op;
fim
_Licenca = [[-------------- Licenca ----------------
A permissão é concedida, a título gratuito, a qualquer pessoa que obtenha uma
cópia deste software e arquivos de documentação associados (o "Software"), para
negociar o Software sem restrição, incluindo, sem limitação, os direitos para
usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e / ou
vender cópias do Software, e permitir que as pessoas a quem o Software é
fornecido o façam, sujeito às seguintes condições:
O aviso de autoria acima e este aviso de permissão devem ser incluídos em
todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU
IMPLÍCITA, INCLUINDO, SEM LIMITAÇÃO, AS GARANTIAS DE COMERCIALIZAÇÃO,
ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE OS
AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER
RECLAMAÇÃO, DANOS OU OUTRAS RESPONSABILIDADES, SEJA EM UMA AÇÃO DE CUMPRIMENTO
DE CONTRATO OU QUALQUER OUTRO MEIO, OU EM CONEXÃO COM O SOFTWARE OU O USO OU
OUTRAS FUNÇÕES DO SOFTWARE.
]]
_Manual = [[
Manual
prismaterm é um terminal interativo para comandos em linguagem Prisma.
Exemplo de comando: imprima('Ola Mundo em Prisma');
Parametros externos:
prismaterm -e string : executa a string ao ser chamado
prismaterm -l lib : carrega uma biblioteca lib.
prismaterm arquivo : executa o arquivo.
Aceita os seguintes parâmetros internos:
-a : exibe ajuda.
-v : exibe versao e autor.
-r : retorna a tela para o inicio, como estava quando prismaterm foi aberto.
-i : abre um bloco multilinha
neste caso você pode digitar um comando de várias linhas
e quando quiser executa-lo digite: --
Obs. o -i e o -- devem estar em linha separada do bloco, ex.:
> -i
funcao ola()
imprima'ola'
fim
--
>> ola()
ola
>>
-s : sai do programa.
-c : modo calculadora.
neste modo pode-se digitar uma operacao e o resultado sera
impresso automaticamente.
Ex.:
>> -c
Modo calculadora iniciado [ -- = sair]
5+2+1
8
4/2
2
ou ainda outros valores:
'ola'
ola
4 == 4
verdadeiro
4 == 1
falso
-l : exibe a licenca deste programa.
-- : fecha: bloco ou modo calculadora.
Obs. a opcao de fechar deve estar em linha unica.
= valor : funciona como um imprima(valor);
= 'ola' o mesmo que imprima('ola')
= 4+3 o mesmo que imprima(4+3);
ex.:
>> = 'Ola mundo'
Ola mundo
>> = 3+9
12
>> = 5 == 10
falso.
etc.
Enter para continuar ... ]];