{--------------------------------------------------------}
{
{      Processador de Scripts
{
{      Autor: José Antonio Borges
{
{      Em 25/6/2000
{
{--------------------------------------------------------}

program scripVox;

uses winprocs, wintypes, dvwin, dvcrt, dvscript, strings;

const versao = '1.1';

var
    nomeArq, rotulo: string;
    arq: text;

{--------------------------------------------------------}
{                 fala uma mensagem
{--------------------------------------------------------}

procedure mensagem (nomeArq: string; apular: integer);
var i: integer;
    s: string;
begin
    if nomeArq = 'SCINIC' then
        s := 'ScriptVox - v'
    else
    if nomeArq = 'SCNOMARQ' then
        s := 'Nome do arquivo .CMD a executar: '
    else
    if nomeArq = 'SCFIM' then
        s := 'Fim do script'
    else
    if nomeArq = 'SCARQNAO' then
        s := 'Arquivo .CMD inexistente'
    else
    if nomeArq = 'SCERREXE' then
        s := 'Erro de execução na linha '
    else
        begin
            writeln;
            writeln ('-------------------------------');
            writeln ('--- mensagem errada: ', s, '---');
            writeln ('-------------------------------');
            writeln;
        end;

    write (s);
    for i := 1 to apular do writeln;

    if existeArqSom (nomeArq) then
        sintsom (nomeArq)
    else
        sintetiza (s);
end;

{--------------------------------------------------------}
{      remove brancos ao inicio e fim de uma cadeia
{--------------------------------------------------------}

procedure trim (var lido: string);
begin
    while (lido <> '') and (lido[1] = ' ') do
        delete (lido, 1, 1);
    while (lido <> '') and (lido[length(lido)] = ' ') do
        delete (lido, length(lido), 1);
end;

{--------------------------------------------------------}
{             transforma cadeia em maiusculos
{--------------------------------------------------------}

function maiusc (s: string): string;
begin
    s := s + #$0;
    ansiUpper (@s[1]);
    delete (s, length (s), 1);
    maiusc := s;
end;

{--------------------------------------------------------}
{                    inicialização
{--------------------------------------------------------}

function inicializa: boolean;
var s: string;
    p: integer;
begin
    inicializa := true;

    sintInic (0, sintAmbiente ('SCRIPVOX', 'DIRSCRIPVOX'));
    clrscr;
    setWindowText (crtWindow, 'SCRIPTVOX');

    if paramCount <> 0 then
        nomeArq := paramStr(1)
    else
        begin
            textBackground (BLUE);
            mensagem ('SCINIC', 0);   {'ScriptVox - v'}
            sintWriteln (versao);
            textBackground (BLACK);
            writeln;

            mensagem ('SCNOMARQ', 0);    {'Nome do arquivo .CMD a executar: '}
            sintReadln (nomeArq);
            if nomeArq = '' then
                begin
                    sintFim;
                    doneWinCrt;
                end;
        end;

    rotulo := '';
    p := pos ('@', nomeArq);
    if p <> 0 then
        begin
            rotulo := copy (nomeArq, p+1, 999);
            delete (nomeArq, p, 999);
            trim (nomeArq);
            trim (rotulo);
        end;

    if maiusc (copy (nomeArq, length(nomeArq)-3, 4)) <> '.CMD' then
         nomeArq := nomeArq + '.CMD';

    assign (arq, nomeArq);
    {$I-}  reset (arq);  {$I+}
    if ioresult = 0 then
        begin
            close (arq);
            exit;
        end;

    if pos ('\', nomeArq) = 0 then
        begin
            s := sintAmbiente ('SCRIPVOX', 'DIRDEFAULT');
            if s = '' then s := 'c:\winvox\scripts';
            if s [length(s)] <> '\' then s := s + '\';
            nomeArq := s + nomeArq;
            assign (arq, nomeArq);
            {$I-}  reset (arq);  {$I+}
            if ioresult = 0 then
                begin
                    close (arq);
                    exit;
                end;
        end;

    mensagem ('SCARQNAO', 1);   {'Arquivo .CMD inexistente'}
    inicializa := false;
end;

{--------------------------------------------------------}
{                    processamento
{--------------------------------------------------------}

procedure processa;
var retorno, ultLinProc: integer;
begin
    retorno := executaScript (nomeArq, '', ultLinProc);
    case retorno of
        SCR_OK:
            mensagem ('SCFIM', 1);   {'Fim do script'}

        SCR_ERROEXEC:
            begin
                showWindow (crtWindow, SW_RESTORE);
                mensagem ('SCERREXE', 0);   {'Erro de execução na linha '}
                sintWriteint (ultLinProc);
                writeln;
                readln;
            end;

        SCR_SEMARQUIVO:
            mensagem ('SCARQNAO', 1);   {'Arquivo inexistente'}
    end;
end;

{--------------------------------------------------------}
{                      finalização
{--------------------------------------------------------}

procedure finaliza;
begin
    delay (1000);
    sintFim;
    doneWinCrt;
end;

{--------------------------------------------------------}
{                     processamento
{--------------------------------------------------------}

begin
    if inicializa then
        processa;
    finaliza;
end.
