Dec 202017
 
TP 4.0+ unit that allows direct access to Dos's PRINT spooler. All documentation is in Spanish.
File SPOOL100.ZIP from The Programmer’s Corner in
Category Pascal Source Code
TP 4.0+ unit that allows direct access to Dos’s PRINT spooler. All documentation is in Spanish.
File Name File Size Zip Size Zip Type
LEGGIMI! 1110 548 deflated
SPOOLDEM.EXE 10672 6665 deflated
SPOOLDEM.PAS 4791 1192 deflated
SPOOLER.DOC 11798 4256 deflated
SPOOLER.MAN 4961 1475 deflated
SPOOLER.PAS 12188 2836 deflated
SPOOLER.TPU 5008 2406 deflated

Download File SPOOL100.ZIP Here

Contents of the SPOOLER.DOC file


SPOOLER ver. 1.0 del 21/04/90

Paolo Ruggieri - Genova

Una unit di PUBBLICO DOMINIO per accedere
ai servizi di PRINT.COM (spooler MS-DOS)
dai programmi in TurboPascal 4.0 o successivi.

Per commenti, suggerimenti e segnalazioni di bugs sono raggiungibile
via modem presso:

Utente MC4479 su MC-Link (300/1200/2400 baud, 8-N-1
06-4510211/4513182/4180440
NUA Itapac 26500140)

o attraverso l'area (echo Italia) TurboPascal presso
vari BBS della rete Fido.
==============================================================================
Con passare delle versioni MS-DOS e` diventato sempre piu` "ingombrante",
in termini di memoria di massa e RAM occupate; a questo aumento di occupazione
e` corrisposto un aumento di affidabilita`, velocita` e di funzionalita`
soprattutto attraverso l'introduzione di nuove utility (comandi esterni) spesso
dimenticate.

Una di queste utility, presente sin dalla versione 2.00 di MS-DOS, e` PRINT,
lo SPOOLer (Simultaneus Peripheral Operation On-Line) che si occupa di stampare
files mentre il nostro PC e` occupato a fare dell'altro; insomma PRINT e`
l'unico barlume di multitasking (standard) nei sistemi MS-DOS (rigorosamente
monotasking per definizione).

Questa capacita` di operare in concorrenza con altre applicazioni, il fatto
che si occupi dell'interfacciamento con la stampante e che "ruba" meno di 7Kb
di RAM ne fa un valido collaboratore per chi sviluppa applicazioni che
prevedono l'uscita su stampante.

A me sembra piuttosto "elegante" un programma che estrae dati da un database
li formatta in un certo modo, li scarica su di un file sequenziale (temporaneo)
e, terminata l'estrazione, passa il file da stampare allo spooler permettendo
di liberare velocemente (come e` noto la stampante e` la periferica piu` lenta
di un computer) la console che si puo` dedicare ad altri compiti.

In questa ottica PRINT ha un difetto: non cancella (a richiesta) un file dopo
averlo stampato; comunque questa piccola pecca puo` essere facilmente aggirata
(per esempio si puo` depositare tutti i files di stampa in una directory il cui
contenuto viene cancellato dall'AUTOEXEC ad ogni reboot del PC).

Per contro la parte TSR di PRINT ha il grosso pregio di rispondere a tutti
quei processi che lo invocano generando l'interrupt $2F e da qui e` nata l'idea
di creare una unit per Turbo Pascal che mi permettesse di comunicare con questo
spooler dai miei programmi TP.
==============================================================================
+-----------+
| Interface |
+-----------+

CONST
~~~~~
MAX_ENTRY_LEN Questa e` la lunghezza delle strighe che vengono passate per
indirizzo attraverso SubmitPacket o direttemente. Vengono
passate in formato ASCIIZ quindi la lunghezza aumenta di un
carattere per accogliere il NUL finale.

MAX_SPOOLER_ENTRY Numero massimo di files in coda, dipende dallo switch /Q:nn
di PRINT (default 10, massimo 32).

MIN_DOS_VERSION Minima versione MS-DOS richiesta:
$0200 (versione 2.00)
oppure
$0300 (versione 3.00)
secondo Peter Norton PRINT e` presente a partire dalla
versione 2.00 ma l'interfaccia dell'interrupt $2F e`
disponibile solo dalla 3.00; mentre per Ray Duncan
l'interfaccia era gia` presente a partire dalla versione 2.00
ma non e` stata documentata fino alla 3.00. Dal momento che
non ho avuto modo di provare sotto MS-DOS 2.xx nel sorgente
(e di conseguenza nella TPU e nel demo) viene richiesta la
versione 3.00 o successiva. Se qualcuno provasse sotto
MS-DOS 2.xx mi piacerebbe avere un feedback.

--+
SPOOLER_INSTALLED |
SPOOLER_NOT_INSTALLED | Valori di ritorno della funzione SpoolerStatus
SPOOLER_CANNOT_BE_INSTALLED | ^^^^^^^^^^^^^
--+

QUEUE_FULL Questo e` l'unico valore (diverso da 0) che ho trovato in
SpoolerResult durante i tests, si verifica quando accodando files
si supera il massimo dichiarato con lo switch /Q:nn. Se qualcuno
ne ottenesse altri mi farebbe cosa gradita se me lo facesse
sapere.

TYPE
~~~~
EntryType e` il tipo stringa che deve essere passato alle funzioni di
accodamento e cancellazione.

QueueType e` il tipo array di EntryType che deve essere passato a SubmitFiles
e ListQueue.

VAR
~~~
SpoolerResult contiene il valore di ritorno delle chiamate alle procedure e
funzioni della UNIT SPOOLER.



+----------------+
| Implementation |
+----------------+

CONST
~~~~~
NUL serve a inizializzare i QueueType passati a SubmitFiles e a ListQueue e
a marcare o testare la fine delle stringhe ASCIIZ.

MAX_ASCIIZ_LEN e` la versione ASCIIZ di MAX_ENTRY_LEN, equivale a
MAX_ENTRY_LEN+1 (espressione che viene accettata dal TP 5.x
ma non dal 4.0).

TYPE
~~~~
ASCIIZType versione ASCIIZ di EntryType.
ASCIIZQueueType versione ASCIIZ di QueueType.

SubmitPacketType parametro per la funzione $0101 (Submit File) di PRINT.

cset parametro per Last.

PathStr (vedi NOTE PER TURBO PASCAL 4.0).

VAR
~~~
regs registri per Intr e MsDos.

HeapFSave variabile puntatore usata per "parcheggiare" il valore di
HeapHerror durante ListQueue.

DosVersion (vedi NOTE PER TURBO PASCAL 4.0).

FUNZIONI e PROCEDURE
~~~~~~~~~~~~~~~~~~~~
InitializeRegisters: in seguito a problemi con SubmitFile (non accodava!!!) ho
introdotto questa procedura che azzera regs prima di ogni
chiamata a Intr o MsDos.

CarryFlag: restituisce true se, al ritorno da una Intr($2F,regs) in carry flag
e` settato (errore).

Str_to_ASCIIZ: trasforma una stringa TP (array di caratteri preceduto da un
byte di lunghezza) in una stringa ASCIIZ (array di caratteri
seguito da un NUL).

ASCIIZ_to_Str: trasforma una stringa ASCIIZ in una stringa TP.

Last: scandisce una stringa partendo dal fondo memorizzandosi (p) e
restituendo la prima posizione di uno dei caratteri del cset c.
(vedi NOTE PER TURBO PASCAL 4.0).

FExpand: (vedi NOTE PER TURBO PASCAL 4.0).

SpoolerStatus: verifica che la versione MS-DOS non sia inferiore a quella
richiesta (se no torna SPOOLER_CANNOT_BE INSTALLED) e che PRINT
sia installato (altrimenti anche SpoolerStatus contiene lo
stesso valore).

SubmitFile: dopo aver verificato che PRINT sia installato (SpoolerStatus)
richiede l'accodamento del file FileString passando l'indirizzo ad
un SubmitPacket con LevelCode=0 (attualmente l'unico valore
possibile) e con l'indirizzo della verisione ASCIIZ di FileString;
se si sono verificati errori SpoolerResult contiene il codice
d'errore.

SubmitFiles: inizializza l'array Queue, ricava il path (dir) da WildCString e
con un ciclo di FindFirst e FindNext richiama SubmitFile; dopo
ogni chiamata se si verifica un errore SpoolerResult contiene il
codice d'errore mentre se l'accodamento ha avuto successo mette il
pathname in Queue.

CancelFIles: dopo aver verificato che PRINT sia installato (SpoolerStatus)
richiede la cancellazione (dalla coda) dei files identificati da
WildCString passando l'indirizzo della versione ASCIIZ di
WildCString; se si sono verificati errori SpoolerResult contiene
il codice d'errore.

CancelAllFIles: dopo aver verificato che PRINT sia installato (SpoolerStatus)
richiede la cancellazione (dalla coda) di tutti i files
accodati; se si sono verificati errori SpoolerResult contiene
il codice d'errore.

HeapFunc: se, in seguito ad una richiesta di allocare memoria (new o getmem),
lo heap manager non riesce ad allocare il blocco di memoria richiesto
chiama una funzione far ($f+), il cui puntatore trova in HeapError,
passandole la dimensione del blocco (dim) e se il valore tornato e` 1
fara` si che la procedura di allocazione torni un puntatore nil.
Il puntatore a questa funzione viene mosso in HeapError da ListQueue.

ListQueue: dopo aver verificato che PRINT sia installato (SpoolerStatus),
inizializza l'array Queue e "parcheggia" il puntatore alla funzione
di errore dello heap contenuto in HeapError e lo sostituisce con
quello a HeapFunc, alloca un array ASCIIZQueueType (ASCIIZ) e
ripristina HeapError, se ASCIIZ non e` stato allocato (nil) esce.
Richiede a PRINT il blocco della coda e la lista dei files in coda
(funzione $0104), verifica il carry falg e nel caso di errore
deposita il codice d'errore in SpoolerResult ed esce; se la funzione
e` giunta buon fine copia dall'indirizzo ottenuto da DS:SI
all'indirizzo puntato da ASCIIZ sizeof(ASCIIZ^) (dimensione
dell'oggetto puntato da ASCIIZ) bytes; quindi sblocca la coda
richiamando la funzione $0105. Trasforma gli elementi di ASCIIZ^ e
li passa a Queue finche' non trova un elemento nullo o raggiunge la
massima dimensione di Queue. Quindi disalloca ASCIIZ^ ed esce.

NOTE PER TURBO PASCAL 4.0
~~~~~~~~~~~~~~~~~~~~~~~~~

Il tipo PathStr, la funzione FExpand e la variabile DosVersion vengono
definiti solo per la versione 4.0 ($IFDEF VER40) perche` gia` presenti nelle
versini 5.x, mentre la funzione Last e` definita per tutte le versioni ma nelle
versioni 5.x poteva essere sostituita da FSplit (divide un pathname nelle su
componenti).

DosVersion: viene caricata nella parte di inizializzazione, tramite la chiamata
alla funzione $30 di MS-DOS, con la versione di MS-DOS.

FExpand: espande il path passato (include il drive e la directory correnti e
converte '.' e '..').
Salva il drive/directory corrente, rende corrente il drive/directory
specificati da path, salva il nuovo drive/directory corrente e
ripristina il drive/directory iniziale.
==============================================================================
Bibliografia:

Ray Duncan, "Advanced MS-DOS programming" 2nd ed., 1988 Microsoft Press
Peter Norton, "PC IBM: guida del programmatore", 1986 Arnoldo Mondadori
("Programmer's guide to IBM PC", 1985 Microsoft Press)
==============================================================================

Questa UNIT (tutti i files SORGENTI, OGGETTO e di DOCUMENTAZIONE) e` di
PUBBLICO DOMINIO.
E` liberamente copiabile e modificabile ma, d'altra parte, non rispondo di
eventuali errori; comunque chi ne rilevasse e` pregato di segnalarmeli cosi`
che possa correggerli.
Se la distribuite ad altri includete tutti i files sopra elencati.
Se la modificate cercate di includere tutti i files sopra elencati piu` la
vostra versione modificata.



 December 20, 2017  Add comments

Leave a Reply