{"id":3142,"date":"2017-09-02T18:08:04","date_gmt":"2017-09-02T22:08:04","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3142"},"modified":"2017-09-02T19:33:36","modified_gmt":"2017-09-02T23:33:36","slug":"biblioteca-terminal","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/biblioteca-terminal\/","title":{"rendered":"Biblioteca terminal"},"content":{"rendered":"<h3>Este \u00e9 um m\u00f3dulo prisma em C com fun\u00e7\u00f5es b\u00e1sicas para o terminal (ou cmd do Win);<\/h3>\n<p>&nbsp;<\/p>\n<p>Fun\u00e7\u00f5es como mudan\u00e7a de t\u00edtulo, de cor, coordenada do cursor, captura de tecla sem precisar pressionar o Enter etc.<\/p>\n<p>Est\u00e1 incluso em Prisma-1.0.102 ou superior (Linux e Win)<\/p>\n<p>Caso queira baixar os fontes clique aqui: \u00a0<a href=\"http:\/\/www.mediafire.com\/file\/fzzp1em3pzk902b\/terminal.7z\" target=\"_blank\">&lt;&lt;baixar&gt;&gt;<\/a><\/p>\n<p>Obs. Se j\u00e1 baixou Prisma-1.0.102 ou superior para Windows n\u00e3o precisar\u00e1 compilar pois j\u00e1 est\u00e1 dispon\u00edvel terminal.dll, em Linux \u00e9 preciso, visto que s\u00f3 est\u00e1 dispon\u00edvel os fontes da vers\u00e3o 1.0.104.<\/p>\n<p><strong>Para compilar em Linux<\/strong>, descompacte o arquivo terminal.7z entre na pasta terminal e execute compila.sh. Necessita ter instalado a lib em C Readline para as fun\u00e7\u00f5es term.leia() e term.ad_historico(). Caso n\u00e3o queira compilar usando o Readline, abra o arquivo terminal.c, na linha 37 apague as duas barras \/\/ em\u00a0\/\/#define _NO_READLINE. Abra tamb\u00e9m o script compila.sh e apague\u00a0<strong>\u00a0-lreadline<\/strong>\u00a0 \u00a0em\u00a0<strong>libs=&#8221; -lreadline &#8220;;\u00a0<\/strong>deixando assim:\u00a0<strong>libs=&#8221; &#8220;;<\/strong><\/p>\n<p>Vamos aos exemplos:<\/p>\n<p>Para incluir use: \u00a0 <strong>local term = inclua&#8217;terminal&#8217;;<\/strong><\/p>\n<h3>1 &#8211; Imprimindo a vers\u00e3o da lib:<\/h3>\n<blockquote><p><strong>imprima(term.versao) \/\/&#8211;&gt;\u00a0<\/strong><strong>lib terminal-1.0.2<\/strong><\/p><\/blockquote>\n<h3>2 &#8211; Mudando o t\u00edtulo da janela do terminal:<\/h3>\n<blockquote><p><strong>term.defTitulo(&#8216;Mudei o T\u00edtulo&#8217;);<\/strong><\/p><\/blockquote>\n<p>Observe que mudou o t\u00edtulo do terminal.<\/p>\n<h3>3 &#8211; Mudando a cor de fundo e da letra:<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'\r\nterm.defCorfundo(term.branco);\r\nterm.defCorletra(term.preto);\r\nimprima('Cor de fundo branco');\r\nterm.defCorletra(term.verde);\r\nimprima('Letra em cor verde');<\/pre>\n<p><strong>Obs.: veja as cores dispon\u00edveis no final no item 11.<\/strong><\/p>\n<h3>4 &#8211; Voltando ao padr\u00e3o &#8211; cor da letra e cor de fundo default:<\/h3>\n<pre class=\"lang:prisma decode:true \">local term = inclua'terminal'; \r\nterm.defPadrao();<\/pre>\n<p>&nbsp;<\/p>\n<h3>5 &#8211; Limpando a tela (cls no Win e clear no Linux):<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\nterm.limpeTela();<\/pre>\n<p>&nbsp;<\/p>\n<h3>6 &#8211; Definindo uma nova posi\u00e7\u00e3o para o cursor do terminal (cursor de escrita, n\u00e3o o do mouse):<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\nterm.cursorPos(1,2); \/\/posiciona o cursor em 1x2<\/pre>\n<p>Coloca o cursor na linha: 1 e na segunda letra.<\/p>\n<h3>7 &#8211; Colocando o cursor no in\u00edcio: (o mesmo que term.cursorPos(1,1) );<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\nterm.cursorInicio();<\/pre>\n<h3>8 &#8211; Obtendo o tamanho do terminal:<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\nalt, larg = term.tamanho();\r\nimprima(\"Altura:\",alt, \"Largura:\",larg);\r\nleia();<\/pre>\n<p>Obs.: Alt = n\u00famero de linhas na escrita. Larg = n\u00famero de letras na horizontal. Portanto n\u00e3o \u00e9 o tamanho da janela, mas do espa\u00e7o de escrita.<\/p>\n<h3>9 &#8211; Obtendo uma tecla pressionada (semelhante ao leia() ) sem precisar pressionar ENTER, a tecla aparece digitada no terminal:<\/h3>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\ns = term.obtCari(); \/\/obtem a tecla\r\nimprima('--&gt;',car(s));<\/pre>\n<p>Esta fun\u00e7\u00e3o deixa vis\u00edvel a tecla pressionada.<\/p>\n<h3>10 &#8211; Obtendo uma tecla pressionada sem precisar pressionar ENTER, a tecla n\u00e3o aparece no terminal:<\/h3>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">local term = inclua'terminal'; \r\ns = term.obtCar(); \/\/obtem a tecla\r\nimprima('--&gt;',car(s));<\/pre>\n<p>Detalhe: o retorno \u00e9 um n\u00famero da tecla, portanto use a fun\u00e7\u00e3o car(s) para converter para caractere.<\/p>\n<h3>Caso voc\u00ea tenha compilado com a lib Readline estar\u00e1 dispon\u00edvel (somente em Linux) duas fun\u00e7\u00f5es extras:<\/h3>\n<p>&nbsp;<\/p>\n<p><strong>Extra 1:<\/strong> \u00a0fun\u00e7\u00e3o term.leia(); igual a fun\u00e7\u00e3o leia() mas permite passar um texto como prompt e al\u00e9m disso torna poss\u00edvel buscar um hist\u00f3rico de comandos digitados usando as teclas: cima \/ baixo. (up, down) do teclado.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">x = term.leia('Digite seu nome:&gt;&gt;&gt; ');\r\n\/\/--&gt; Digite seu nome: &gt;&gt;&gt;| \r\n<\/pre>\n<p><strong>\u00a0Extra 2:<\/strong> fun\u00e7\u00e3o para criar um hist\u00f3rico dos textos digitados anteriormente, sem ele n\u00e3o \u00e9 poss\u00edvel usar as teclas cima\/baixo para buscar o hist\u00f3rico.<\/p>\n<pre class=\"lang:prisma decode:true\"> term.ad_historico(\"comando string a ser gravado\");<\/pre>\n<p>Exemplo de hist\u00f3rico:<\/p>\n<pre class=\"lang:prisma decode:true\">local term = inclua'term'\r\n\r\nlocal imprima=imprima;\r\nse sis.nome:procure'win' entao\r\n  local win=inclua'win';\r\n  \/\/win.poe'dentro';\r\n  local conv_c = conv_c;\r\n  imprima=funcao(...)\r\n    \/\/poe'dentro';\r\n    local t = {...};\r\n    para i,v em ipares(t) inicio\r\n      es.escreva(conv_c(v),'\\t');\r\n    fim\r\n    poe'';\r\n  fim\r\nfim\r\n\r\n\/\/essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux\r\n\r\n\/\/vou tentar fazer para windows no futuro.\r\n\r\n\/\/uma funcao interessante \u00e9 obter um caractere digitado sem precisar pressionar enter.\r\n\/\/essas fun\u00e7\u00f5es n\u00e3o surtem efeito no windows, apenas para compatibilidade;\r\nenquanto c &lt;&gt; 's' e c &lt;&gt; 'S' inicio\r\n  c = term.leia('digite algo: ');\r\n  term.ad_historico(c);\/\/com as teclas seta acima e seta abaixo \u00e9 possivel pegar os ultimos comandos digitados.\r\n  imprima('\\nuse seta acima ou abaixo para ver o hist\u00f3rico\\n');\r\n  imprima('Voc\u00ea digitou:', c);\r\nfim \r\n\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>11 &#8211; Cores dispon\u00edveis:<\/h3>\n<p>term.preto.<br \/>\nterm.azulclaro<br \/>\nterm.verdeclaro<br \/>\nterm.cianoclaro<br \/>\nterm.vermelhoclaro<br \/>\nterm.magentaclaro<br \/>\nterm.amareloclaro<br \/>\nterm.cinzaclaro<br \/>\nterm.cinza<br \/>\nterm.azul<br \/>\nterm.verde<br \/>\nterm.ciano<br \/>\nterm.vermelho<br \/>\nterm.magenta<br \/>\nterm.amarelo<br \/>\nterm.branco<\/p>\n<p>&nbsp;<\/p>\n<p>Exemplo de c\u00f3digo:<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/teste da biblioteca\r\ninclua'terminal'; \/\/esta biblioteca inclui tamb\u00e9m a terminal\r\nlocal imprima=imprima;\r\nse sis.nome:procure('win') entao\r\n  local win=inclua'win';\r\n  \/\/win.poe'dentro';\r\n  local conv_c = conv_c;\r\n  imprima=funcao(...)\r\n    \/\/poe'dentro';\r\n    local t = {...};\r\n    para i,v em ipares(t) inicio\r\n      es.escreva(conv_c(v),'\\t');\r\n    fim\r\n    poe'';\r\n  fim\r\nfim\r\n\/\/poe(conv_c('ol\u00e1'));\r\n\/\/leia();\r\n\r\nterm.defCorfundo(term.branco);\r\nterm.defCorletra(term.preto);\r\nimprima('Cor de fundo branco');\r\nterm.defCorletra(term.verde);\r\nimprima('Letra em cor verde');\r\nterm.defCorletra(term.vermelho);\r\nimprima(\"Letra em cor Vermelha\");\r\n\r\nterm.defPadrao(); \/\/volta a cor padrao\r\n\r\nimprima('Cmd voltou ao padr\u00e3o');\r\n\r\nterm.cursorPos(1,2); \/\/posiciona o cursor em 1x2\r\n\r\nleia(); \/\/pressione enter para sair;\r\n\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Recorte de tela:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3143\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/09\/terminal.png\" alt=\"terminal\" width=\"238\" height=\"120\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Mesmo sem ter o readline \u00e9 poss\u00edvel simular o hist\u00f3rico usando apenas as fun\u00e7\u00f5es b\u00e1sicas do terminal, veja:<\/p>\n<pre class=\"lang:prisma decode:true \">local term = inclua'terminal'\r\n\r\nlocal index=1;\r\nlocal tab={};\r\nfuncao AdHistorico(s)\r\n  tab[#tab+1]=s;\r\n  index = #tab;\r\nfim\r\n\r\nfuncao Prompt(s)\r\n  es.escreva(s);\r\n  local tam = #s;\r\n  local ret, x = '';\r\n  enquanto 1 inicio\r\n    x = term.obtCar();\r\n    se x == 27 entao\r\n      x = term.obtCar();\r\n      se x == 91 entao\r\n        x = term.obtCar();\r\n        se car(x) == 'A' entao\r\n          se index &lt; 1 entao index = 1; fim\r\n          se index &gt; #tab entao index = #tab; fim\r\n          local ss = string.nconcat(' ',tam);\r\n          es.escreva('\\r' .. ss);\r\n          es.esvazie();\r\n          es.escreva(string.formate(\"\\r%s%s\",s,tab[index]));\r\n          es.esvazie();\r\n          tam = #s + #tab[index];\r\n          index = index + 1;\r\n        senaose car(x) =='B' entao\r\n          se index &lt; 1 entao index = 1; fim\r\n          se index &gt; #tab entao index = #tab; fim\r\n          local ss = string.nconcat(' ',tam);\r\n          es.escreva('\\r' .. ss);\r\n          es.esvazie();\r\n          es.escreva(string.formate(\"\\r%s%s\",s,tab[index]));\r\n          es.esvazie();\r\n          tam = #s + #tab[index];\r\n          index = index - 1;\r\n        fim\r\n      fim\r\n    senaose car(x) == '\\n' ou x == '\\r' entao\r\n      poe'';\r\n      retorne ret;\r\n    senaose x == 127 entao\r\n      ret = string.corte(ret,1,#ret -1);\r\n      local ss = string.nconcat(' ',tam);\r\n      es.escreva('\\r' .. ss);\r\n      es.esvazie();\r\n      es.escreva(string.formate(\"\\r%s%s\",s,ret));\r\n      es.esvazie();\r\n      tam = #s + #ret;\r\n    senao\r\n      es.escreva(car(x));\r\n      ret = ret .. car(x);\r\n      tam = #s + #ret;\r\n    fim\r\n    \r\n  fim\r\nfim\r\n\r\nenquanto 1 inicio\r\n  a = Prompt(\"Digite algo: \");\r\n  AdHistorico(a);\/\/guarda no hist\u00f3rico\r\n  poe(a);\r\nfim\r\n<\/pre>\n<p>Usamos uma tabela prisma para formar o hist\u00f3rico.<\/p>\n<p>Use as teclas cima\/baixo do teclado para ver o hist\u00f3rico digitado anteriormente.<\/p>\n<h3>Criando uma fun\u00e7\u00e3o que l\u00ea senhas:<\/h3>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true  \">local term = inclua'term';\r\n\r\n\/\/a lib term.pris \u00e9 uma biblioteca feita em prisma com fun\u00e7\u00f5es para mudar cor do terminal.\r\n\/\/quando ela \u00e9 inclu\u00edda, inclui automaticamente a lib terminal.so\r\n\r\n\/\/essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux\r\n\r\n\/\/vou tentar fazer para windows no futuro.\r\n\r\n\/\/uma funcao interessante \u00e9 obter um caractere digitado sem precisar pressionar enter.\r\n\r\nfuncao leia_senha(s,dig)\r\n  local dig = dig ou '*';\r\n  local tam = #s;\r\n\r\n  local novalin = 10;\r\n  se sis.nome=='win32' entao novalin=13; fim\r\n  es.escreva(s);\r\n  local senha = '';\r\n  enquanto 1 inicio\r\n    local x = term.obtcar();\/\/n\u00e3o aparece a letra quando voc\u00ea digita no terminal\r\n    \/\/imprima(x);\r\n    se (x &gt;= 97 e x &lt;= 122 ) ou (x&gt;=32 e x&lt;=90) entao\r\n       \/\/poe'dentro';\r\n        senha = senha .. car(x);\r\n        tam = #s + #senha;\r\n        es.escreva(dig);\r\n    senaose x == 127 entao \/\/backspace\r\n        senha = string.corte(senha,1,#senha -1);\r\n        local ss = string.nconcat(' ',tam);\r\n        local sss = string.nconcat(dig,#senha);\r\n        es.escreva('\\r' .. ss);\r\n        es.esvazie();\r\n        es.escreva(string.formate(\"\\r%s%s\",s,sss));\r\n        es.esvazie();\r\n        tam = #s + #senha;\r\n    senaose x == novalin entao\r\n        retorne senha;\r\n    fim  \r\n  fim\r\n  \r\nfim \/\/fim fun\u00e7\u00e3o\r\n\r\nimprima('\\n\\nSua senha \u00e9:', leia_senha(\"Digite sua senha: \",'*') );\r\n\r\n\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Por enquanto \u00e9 isso.<\/p>\n<p>Falou, pessoal, at\u00e9 a pr\u00f3xima.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este \u00e9 um m\u00f3dulo prisma em C com fun\u00e7\u00f5es b\u00e1sicas para o terminal (ou cmd do Win); &nbsp; Fun\u00e7\u00f5es como mudan\u00e7a de t\u00edtulo, de cor, coordenada do cursor, captura de tecla sem precisar pressionar o Enter etc. Est\u00e1 incluso em Prisma-1.0.102 ou superior (Linux e Win) Caso queira baixar os fontes clique aqui: \u00a0&lt;&lt;baixar&gt;&gt; Obs&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-3142","post","type-post","status-publish","format-standard","hentry","category-modo_texto"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=3142"}],"version-history":[{"count":4,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3142\/revisions"}],"predecessor-version":[{"id":3147,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3142\/revisions\/3147"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}