{"id":716,"date":"2016-08-15T20:43:31","date_gmt":"2016-08-15T18:43:31","guid":{"rendered":"http:\/\/www.hunggartorino.it\/ql\/?p=716"},"modified":"2016-08-22T12:26:08","modified_gmt":"2016-08-22T10:26:08","slug":"dal-sbasic-allhtml","status":"publish","type":"post","link":"http:\/\/www.hunggartorino.it\/ql\/dal-sbasic-allhtml\/","title":{"rendered":"Dal S*BASIC all&#8217;HTML"},"content":{"rendered":"<p style=\"text-align: justify;\">Nel numero della rivista QUANTA del maggio 2015 avevo pubblicato un programma chiamato SBldr. Questo prende un file S*BASIC e lo esegue (EXegue), come se fosse un job in linguaggio macchina. Niente di straordinario, sicuramente. Comunque l&#8217;X-factor del lavoro \u00e8 che se il codice sorgente non contiene numeri di linea (e in tal caso non \u00e8 EXeguibile), SBldr li aggiunge al volo, permettendo cos\u00ec l&#8217;EXecute del programma.<\/p>\n<p style=\"text-align: justify;\">L&#8217;esempio qui sotto \u00e8 un livello successivo. Uno dei punti di questa utilit\u00e0 di esempio \u00e8 la dimostrazione di come si invoca un&#8217;istanza della Thing SBASIC (cosa che, in teoria, \u00e8 fattibile da qualsiasi linguaggio di programmazione) utilizzandone le caratteristiche, in questo caso per tokenizzare un sorgente S*BASIC. La peculiarit\u00e0 di questo programma \u00e8 la capacit\u00e0 di convertire un sorgente S*BASIC in HTML, tramite il mio programma sb2htm. In questo senso potrebbe essere molto interessante per gli utenti SMSQ\/E (come me) che scrivono programmi S*BASIC tramite editor. Alcune delle tecniche impiegate potrebbero essere utili agli interessati al S*BASIC, ma molte di queste funzionano solo in SMSQ\/E e SBASIC (anche se si pu\u00f2 fare qualcosa di simile con Minerva).<\/p>\n<p style=\"text-align: justify;\">Se la conversione S*BASIC in HTML non vi affascina, lasciatemi solo accennare al fatto che una piccola modifica del programma presentato qui sotto permette di compilare un programma S*BASIC direttamente da QD (e probabilmente da altri editor) o da qualsiasi file manager compatibile FileInfo2, o dalla linea di comando, senza dover fare il QSAVE del sorgente n\u00e9 tantomeno aggiungere numeri di linea. In questo modo si potrebbe accelerare di molto lo sviluppo e il debug di programmi.<\/p>\n<p style=\"text-align: justify;\">Prima di tutto spieghiamo il programma.<\/p>\n<h3 style=\"text-align: justify;\">Il problema \u00e8 questo:<\/h3>\n<p style=\"text-align: justify;\">ancorch\u00e9 gli schermi diventino sempre pi\u00f9 grandi, i fount del QL non sono cambiati; anzi, sembrano diventare sempre pi\u00f9 piccoli e pi\u00f9 difficili da leggere! Editor di testo come QD sono migliori di EDIT per la scrittura di programmi appena appena complessi, ma anche loro hanno solo combinazioni di nero su grigio, e molti di essi non hanno idea di cosa viene scritto.<\/p>\n<h3 style=\"text-align: justify;\">La soluzione (1a parte):<\/h3>\n<p style=\"text-align: justify;\">una soluzione parziale \u00e8 il mio programma sb2htm, disponibile presso il sito di Dilwyn, sotto Software Download\/HTML utilities. Questo prende un programma S*BASIC tokenizzato e lo converte in HTML navigabile e con evidenziazione della sintassi. I colori possono esser cambiati a piacere, e il browser \u00e8 in grado di mostrare caratteri delle dimensioni che volete. (Navigabile significa che \u00e8 possibile seguire il flusso del programma grazie al fatto che le definizioni di PROCedure e FuNzioni sono linkate ed \u00e8 possibile seguirle. Cliccando sul tasto Indietro del browser si pu\u00f2 tornare al punto di chiamata). Il box di ricerca locale del browser, e le funzioni di ricerca del SO sottostante, possono anch&#8217;esse rivelarsi molto utili.<\/p>\n<h3 style=\"text-align: justify;\">Problemi:<\/h3>\n<p style=\"text-align: justify;\">Finora l&#8217;aspetto negativo \u00e8 soprattutto il numero di passi da fare per produrre un output HTML di un file senza numeri di linea in un editor come QD:<\/p>\n<p style=\"text-align: justify;\">&#8211; Aggiungere i numeri di linea<br \/>\n&#8211; Salvare il file<br \/>\n&#8211; Caricarlo nell&#8217;interprete e tokenizzarlo<br \/>\n&#8211; QSAVE del file<br \/>\n&#8211; Convertirlo in Html<br \/>\n&#8211; Passare al SO ospite e leggerlo via browser<br \/>\n&#8211; Per continuare a scrivere, tornare al QL e rimuovere i numeri di linea<\/p>\n<h3 style=\"text-align: justify;\">La soluzione (seconda parte):<\/h3>\n<p style=\"text-align: justify;\">SBhtm. Questo programma esegue molta parte del lavoro in maniera veloce e semplice. Assegnandolo a una hotkey, tutto quel che serve fare \u00e8:<\/p>\n<p style=\"text-align: justify;\">&#8211; Salvare il programma, con o senza numeri di linea, in QD<br \/>\n&#8211; Premere la hotkey<br \/>\n&#8211; Aprire il file nel browser, o aggiornarlo se gi\u00e0 aperto<br \/>\n&#8211; Rientrare nel QL e proseguire<\/p>\n<p style=\"text-align: justify;\">(Devo forse ricordare che salvando il file in QD, questi ne mette percorso e nome file nello Stufferbuffer)<\/p>\n<p style=\"text-align: justify;\">In caso di necessit\u00e0 io posso usare due monitor attaccati al computer. A quel punto estendo il desktop di Windows per usarli entrambi. QPC2 gira a pieno schermo su un monitor, e il browser \u00e8 aperto sull&#8217;altro. I passi descritti sopra rendono l&#8217;intera procedura pi\u00f9 o meno immediata, permettendomi di modificare il programma su uno schermo e avere un riferimento chiaro e facile da leggere e navigare sull&#8217;altro. Il risultato potrebbe sembrare simile al listato qui sotto (dipende da chi pubblica l&#8217;articolo).<\/p>\n<h3 style=\"text-align: justify;\">Il programma<\/h3>\n<pre>REMark $$chan=4\r\n:\r\nREMark + ------------------------------<wbr \/>---------------------- +\r\nREMark |&lt;                   SBASIC to Html                   &gt;|\r\nREMark + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<wbr \/>~~~~~~~~~~~~~~~~~~~~~~ +\r\nREMark | Converts SBASIC programs to HTML using sb2htm        |\r\nREMark | Adds line numbers to numberless code via intermed-   |\r\nREMark | iary file in a temporary directory                   |\r\nREMark |                                                      |\r\nREMark | Add to FileInfo2 or use with EX:                     |\r\nREMark |                                                      |\r\nREMark | er = FEW(&lt;SBhtm&gt;;\"&lt;program&gt;_bas [;&lt;command_line&gt;]\")  |\r\nREMark |                                                      |\r\nREMark | SBhtm passes the optional &lt;command_line&gt; to sb2htm   |\r\nREMark | Use this to supply standard sb2htm cmdl parameters   |\r\nREMark | (see sb2htm manual) except the -i command.           |\r\nREMark |                                                      |\r\nREMark | Version 1.01, pjw, 2oi5, SBASIC only!                |\r\nREMark + ------------------------------<wbr \/>---------------------- +\r\n:\r\nREMark       Config:\r\ns2h$ = 'win2_util_s2h_sb2htm_obj': REMark Html conversion program\r\nout$ = 'dos3_': REMark Default HTML output to My D:\/temp\/\r\ntmp$ = 'ram1_sbhtmxxx': REMark Location and name of temp file\r\nfirst% = 10: step% = 1: REMark First line and step size\r\n:\r\nREMark       Get input file name\r\nREMark Get it either from cmdl or from Stufferbuffer\r\nl% = LEN(CMD$)\r\nIF l% = 0 THEN\r\n fnm$ = HOT_GETSTUFF$: l% = LEN(fnm$)\r\nELSE\r\n fnm$ = CMD$\r\nEND IF\r\nIF l% &lt; 9: Bye -12\r\n:\r\nREMark       Process command line(s)\r\ncom$= ''\r\nREMark Embedded command line?\r\ns% = ';' INSTR fnm$\r\nIF s% THEN\r\n IF s% &lt; l%: com$ = fnm$(s% + 1 TO l%)\r\n l% = s% - 1: fnm$ = fnm$(1 TO l%)\r\nEND IF\r\n:\r\nREMark       Extract name from file name\r\nci = FOP_DIR(fnm$): IF ci &lt; 0: Bye ci\r\ndir$ = FNAME$(#ci): CLOSE#ci\r\nci = FOP_IN(fnm$): IF ci &lt; 0: Bye ci\r\nnm$ = fnm$(7 + LEN(dir$) TO LEN(fnm$) - 4)\r\n:\r\nREMark       Filter by extension\r\nIF fnm$(l% - 2 TO l%) == 'sav' THEN\r\n REMark _sav files pass straight through\r\n bas = 0\r\n CLOSE#ci\r\nELSE\r\n REMark _bas file w\/wo line number\r\n IF fnm$(l% - 2 TO l%) == 'bas' THEN\r\n  bas = 1\r\n ELSE\r\n  REMark Wrong file type\r\n  Bye -12\r\n END IF\r\n :\r\n REMark Line numbers or not?\r\n INPUT#ci; l$\r\n IF NOT l$(1) INSTR '123456789' THEN\r\n  :\r\n  REMark     Process line numberless file\r\n  fnm$ = tmp$ &amp; '_bas'\r\n  co = FOP_OVER(fnm$): IF co &lt; 0: Bye co\r\n  bas = 2: i% = first%: lno$ = i%\r\n  BPUT#co; lno$, 32, l$, 10\r\n  :\r\n  FOR i% =  first% + step% TO 32767 STEP step%\r\n   IF EOF(#ci): EXIT i%\r\n   INPUT#ci; l$: lno$ = i%\r\n   BPUT#co; lno$, 32, l$, 10\r\n  END FOR i%\r\n  CLOSE#co\r\n END IF\r\n CLOSE#ci\r\n :\r\n REMark     Process non-sav files\r\n REMark Use SBASIC slave to tokenise program\r\n pip$ = 'pipe_p' &amp; HEX$(JOBID,32)\r\n co = FOPEN(pip$ &amp; 'o_2048'): IF co &lt; 0: Bye co\r\n :\r\n REMark Slave will take instructions from here\r\n cm$ = 'ci = fop_in(#0; \"' &amp; pip$ &amp; 'o\")'\r\n :\r\n REMark Start SBASIC with our opening command\r\n EXEP 'SBASIC'; cm$\r\n :\r\n REMark Tell it what we want\r\n PRINT#co; 'load \"' &amp; fnm$ &amp; '\"'\r\n PRINT#co; 'qsave_o \"' &amp; tmp$ &amp; '\"'\r\n PRINT#co; 'beep 2,2: beep 2,2': REMark Signal success\r\n PRINT#co; 'quit': REMark Job done! Get rid of slave\r\n fnm$ = tmp$ &amp; '_sav'\r\nEND IF\r\n:\r\nREMark      Create sb2htm command line\r\ncom$ = '-i!' &amp; fnm$ &amp;' '&amp; com$ &amp; ' -o' &amp; out$ &amp; nm$ &amp; '.htm -t' &amp; nm$\r\nIF bas = 2: com$ = com$ &amp; ' -noff'\r\n:\r\nREMark      Convert tokenised file to HTML\r\nBye FEW(s2h$; com$)\r\n:\r\nREMark      Tidy and quit\r\nDEFine PROCedure Bye(er)\r\nIF er &lt; 0: BEEP 3000,255\r\nREMark Remove any temporary files\r\nIF bas: DELETE fnm$\r\nIF bas = 2: DELETE tmp$ &amp; '_bas'\r\nQUIT er\r\nEND DEFine Bye<\/pre>\n<h3 style=\"text-align: justify;\">Cosa fa SBhtm:<\/h3>\n<p style=\"text-align: justify;\">SBhtm prende il nome del file da elaborare dalla riga di comando. Se non \u00e8 presente un nome di file, prende il nome dallo Stufferbuffer. Lanciando il programma tramite EX, si dovrebbe dare una riga di comando che contenga almeno il filespec del file sorgente da elaborare. Altri parametri che si vogliano passare a sb2htm devono essere scritti nella pseudo linea di comando, per cui<\/p>\n<p style=\"text-align: justify;\">EW &lt;SBhtm&gt;; &lt;filespec&gt; &amp; &#8216;; -odos5_&#8217;<\/p>\n<p style=\"text-align: justify;\">significa: Esegui il programma SBhtm (compilato o meno) con il percorso e il nome di file dato in &lt;filespec&gt;, che termina per _bas o _sav (o .bas or .sav (ma anche tubas!)). La pseudo linea di comando inizia dopo il secondo punto e virgola. Questa passa attraverso SBhtm per andare a sb2htm e dirgli che volete che l&#8217;uscita del programma sia ridiretta a dos5_ invece che nella directory predefinita di SBhtm. Tutti gli errori provenienti dal processo vengono riportati in er al completamento.<\/p>\n<p style=\"text-align: justify;\">Il programma pu\u00f2 quindi essere compilato con QLib e assegnato a una hotkey:<\/p>\n<p style=\"text-align: justify;\">ERT HOT_RES1(&lt;key&gt;, &lt;path&gt;SBhtm_obj)<\/p>\n<p style=\"text-align: justify;\">Usato da una hotkey, SBhtm usa valori predefiniti eccezion fatta per il nome file, che recupera dallo Stufferbuffer. Esistono parecchie possibilit\u00e0&#8230;<\/p>\n<h3 style=\"text-align: justify;\">Per elencare le altre cose che fa SBhtm:<\/h3>\n<p style=\"text-align: justify;\">Dato un file, SBhtm ne controlla l&#8217;estensione e cerca di aprirlo. Sono possibili tre scenari:<\/p>\n<p style=\"text-align: justify;\">file bas<br \/>\nsorgenti S*BASIC<\/p>\n<p style=\"text-align: justify;\">file bas senza numeri di linea<br \/>\nViene creato un file temporaneo per dare al file i numeri di linea prima della tokenizzazione.<br \/>\nfile bas con numeri di linea<br \/>\nTramite un file temporaneo si crea la tokenizzazione prima della conversione in HTML<\/p>\n<p style=\"text-align: justify;\">file sav<br \/>\nSono gi\u00e0 tokenizzati e vengono passati direttamente a sb2htm.<\/p>\n<p style=\"text-align: justify;\">Per la tokenizzazione viene evocata un&#8217;istanza di SBASIC tramite FEP\/EXEP, istruito a prendere i suoi comandi da una pipe aperta verso SBhtm. SBhtm dice al SBASIC slave di caricare &lt;filespec&gt; o il file temporaneo, a seconda del caso. Gli errori di sintassi vengono marcati come MISTake. Dopo che SBASIC ha analizzato il codice, il file viene salvato con QSAVE in un altro file temporaneo.<\/p>\n<p style=\"text-align: justify;\">Lo slave SBASIC non \u00e8 pi\u00f9 necessario e pu\u00f2 essere rimosso. sb2htm viene invocato con il file _sav temporaneo per fare le proprie elaborazioni, e il risultato viene salvato nella directory specificata o in quella predefinita.<\/p>\n<p style=\"text-align: justify;\">Se \u00e8 stato creato un file _bas temporaneo, questo viene cancellato esattamente come per un eventuale file _sav temporaneo: nessuno dei file originali viene cancellato.<\/p>\n<h3 style=\"text-align: justify;\">Finale<\/h3>\n<p style=\"text-align: justify;\">Per calmare i fanatici del SuperBASIC sicuramente orripilati dal mio uso liberale di linee vuote e di altre raffinatezze puerili, chiarir\u00f2 che a runtime il SBASIC non viene influenzato da queste cose. Esso raffina il programma tokenizzato anche di pi\u00f9 del SuperBASIC, terminando &#8211; a parte altri vantaggi &#8211; con l&#8217;interprete che legge solo codice effettivo. Tutto il codice che non ha impatto sul funzionamento del programma viene brutalmente cancellato, le ambiguit\u00e0 vengono risolte, le espressioni e le strutture sviluppate, producendo un codice molto pi\u00f9 efficiente e vicino a quello compilato con QLib.<\/p>\n<p style=\"text-align: justify;\">C&#8217;\u00e8 ancora altro da dire su questo programma in relazione a sb2htm. Dovrebbe risultare chiaro una volta che si gioca un po&#8217; con entrambi. Io ho scritto questo pezzo in parte per riprendere sb2htm, che sta ricevendo qui in laboratorio una silenziosa revisione, e verr\u00e0 rilasciato al momento opportuno dopo aver messo i puntini sulle i e le lineette sulle t. Brima di provare SBhtm, dovreste aver installato e testato sb2htm per avere un&#8217;idea di come funziona.<\/p>\n<p style=\"text-align: justify;\">Quello che mi piacerebbe che sviluppaste \u00e8 il modo in cui si possono usare i job figli SBASIC. Non ci vuole molto a capire che, invece che a sb2htm, il file potrebbe essere mandato a Q_Liberator. In tal modo, dall&#8217;editing del programma S*BASIC in QD, in tre passi sarebbe possibile compilarlo e anche eseguirlo!<\/p>\n<p style=\"text-align: justify;\">Ma questo lo lasciamo come esercizio per il fervente pensatore&#8230;<br \/>\nSuggerimento: per trasformare SBhtm in SBobj (niente trucchi) sono necessari pochi cambiamenti, soprattutto alla linea di comando com$ \ud83d\ude09<\/p>\n<p style=\"text-align: justify;\">Per J. Witte<\/p>\n","protected":false},"excerpt":{"rendered":"Nel numero della rivista QUANTA del maggio 2015 avevo pubblicato un programma chiamato SBldr. Questo prende un file S*BASIC e lo esegue (EXegue), \n<a class=\"moretag\" href=\"http:\/\/www.hunggartorino.it\/ql\/dal-sbasic-allhtml\/\"> [..more...]<\/a>","protected":false},"author":5,"featured_media":723,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-716","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programmazione"],"_links":{"self":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/comments?post=716"}],"version-history":[{"count":5,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/716\/revisions"}],"predecessor-version":[{"id":735,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/posts\/716\/revisions\/735"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/media\/723"}],"wp:attachment":[{"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/media?parent=716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/categories?post=716"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hunggartorino.it\/ql\/wp-json\/wp\/v2\/tags?post=716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}