2.1.4. SPECIAL-NAMES

SPECIAL-NAMES.
   [CALL-CONVENTION inteiro1 IS mnemonico1]
   [CONSOLE IS CRT]
   [CRT STATUS IS identificador1]
   [CURRENCY SIGN IS literal2]
   [CURSOR IS identificador2]
   [DECIMAL-POINT IS COMMA]
   [LOCALE identificador4 IS literal3]
   [NUMERIC SIGN IS TRAILING SEPARATE]
   [device1 IS mnemonico2]
   [canal1 IS mnemonico3]
   [Definição de Classe]
   [Definição de Switches]
   [Definição de Constantes Figurativas]
   .

O parágrafo SPECIAL-NAMES não pode ser declarado em programas aninhados, uma vez que toda a CONFIGURATION SECTION é herdada do programa pai.

As sentenças podem ser codificadas em qualquer ordem, e apenas a última precisa terminar com um ponto.

CALL-CONVENTION

Associa um número inteiro a um mnemônico. Esse número inteiro, na verdade, representa uma série de switches ligadas e/ou desligadas. O mnemônico poderá então ser usado em comandos CALL alterando a forma como a LINKAGE será usada pelo programa chamado.

CONSOLE IS CRT

Fará com que os comandos DISPLAY e ACCEPT não precisem declarar a cláusula UPON quando estiverem fazendo referência a telas da SCREEN SECTION.

CRT STATUS

Permite ao programador definir a variável que vai receber as teclas função (inclusive ESC, ENTER etc) pressionadas pelo usuário durante um comando ACCEPT. O nome dessa variável é indicada em identificador1 e ela precisa ser declarada na WORKING com PIC 9(4).

Se a sentença CRT STATUS não for declarada, o compilador criará implicitamente uma variável para essa finalidade chamada COB-CRT-STATUS também com PIC 9(4).

CURRENCY SIGN

É usada para que o programa use algum outro caracter diferente de $ para representar valores monetários.

CURSOR

Permite ao programador indicar uma variável que receberá a posição do cursor na tela depois que um comando ACCEPT é executado. Essa variável deve ser definida na WORKING-STORAGE com o mesmo nome informado em identificador2. Ela pode ter PIC 9(4) ou PIC 9(6) e receberá um número no formato rrcc (ou rrrccc) onde rr mostrará a linha onde o cursor estava (começando em zero) e cc mostrará a coluna (também começando em zero).

DECIMAL-POINT

DECIMAL POINT IS COMMA faz com que o programa utilize vírgula para separar os inteiros das casas decimais, ao invés do ponto, que é o default da linguagem.

LOCALE

Permite ao programador estabelecer para o programa alguma configuração regional disponível no sistema operacional onde o programa for executado, mas que não necessariamente é a configuração default do usuário ou do sistema operacional (ver comentário sobre isso na página que fala sobre OBJECT COMPUTER). Por exemplo, se o programa for rodar numa máquina configurada para trabalhar com en_US e o programador quiser usar “português do Brasil”, ele pode codificar LOCALE PTBR IS “pt_BR”.

NUMERIC SIGN

NUMERIC SIGN IS TRAILING SEPARATE faz com que toda variável numérica USAGE DISPLAY seja criada como se a cláusula SIGN IS TRAILING SEPARATE CHARACTER tivesse sido declarada na definição da variável.

Mnemonic Devices

device1 IS mnemonico2 permite que o programador defina um nome alternativo para um ou mais dispositivos reconhecidos pelo GnuCOBOL: CONSOLE, STDIN, SYSIN, SYSIPT, PRINTER, STDOUT, SYSLIST, SYSLST, SYSOUT, STDERR e SYSERR.

Channels

canal1 IS mnemonico3 permite que o programador associe um dos treze canais de posicionamento vertical de impressora a um mnemônico que será mencionado num comando WRITE AFTER. É possível , por exemplo, declarar C01 IS SALTAR-PAGINA e depois codificar WRITE LINHA AFTER SALTAR-PAGINA na PROCEDURE DIVISION. Canais de posicionamento vertical são muito comuns em impressoras de linha existentes na plataforma mainframe. Se esse recurso for usado para uma impressora que não tenha canais de posicionamento vertical, o programa enviará simplesmente um Line-Feed para a impressora.

Definição de classes

CLASS nome1 IS literal1 (THRU | THROUGH) literal2

Classes de caracteres podem ser usadas para verificar o tipo de determinado dado. O COBOL possui classes pré-definidas que podem ser usadas nesse tipo de teste, como NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER e OMITTED. Todas essas classes pré-definidas podem ser usadas na PROCEDURE DIVISION para fazer testes como…

IF WT-ID-FUNCIONARIO IS NOT NUMERIC
    (faz alguma coisa)
END-IF

A uso da cláusula CLASS no parágrafo SPECIAL-NAMES permite que o programador crie outras classes de caracteres, além daquelas pré-definidas pelo COBOL. Ela permite, por exemplo, criar algo assim…

CLASS HEXADECIMAL IS "0" THRU "9"
                     "A" THRU "F"
                     "a" THRU "f".

E mais tarde, na PROCEDURE DIVISION, o programador poderia codificar…

IF SS-CAMPO IS HEXADECIMAL
    (faz alguma coisa)
END-IF

Definição de Switches

nome1 [IS mnemonico1]
   ([ON STATUS IS condicao1] | [OFF STATUS IS condicao2])

A cláusula de definição de switches permite que o programador associe um dos 16 switches de execução a um nome de condição, de maneira que depois possa usado esses nomes para testar o valor do switch na PROCEDURE DIVISION.

  1. O nome do switch deve ser SWITCH-n, onde n varia de 0 a 15.
  2. Quando o programa for executado, cada um desses 16 switches será associado com o valor colocado em variáveis de ambiente chamadas COB_SWITCH_n, onde n também varia de 0 a 15.
  3. Essas variáveis de ambiente devem ser preenchidas com “ON” ou “OFF”. Não faz diferença se esse valor está em lower ou em uppercase.

Um exemplo prático ajuda a entender melhor. No parágrafo SPECIAL-NAMES do programa associamos um nome de condição ao switch 0:

SPECIAL-NAMES.
   SWITCH-0 ON STATUS IS TRACE-ATIVADO.

E na PROCEDURE DIVISION codificamos:

IF TRACE-ATIVADO
    DISPLAY "ESTOU NO PARAGRAFO XXX"
END-IF

Para executar o programa no Linux, faríamos algo como…

$ export COB_SWITCH_0=ON
$ nome-do-programa
ESTOU NO PARAGRAFO XXX
$

E no Windows…

C:> set COB_SWITCH_0=ON
C:> nome-do-programa
ESTOU NO PARAGRAFO XXX
C:>

Definição de Constantes Figurativas

SYMBOLIC CHARACTERS nome1 IS inteiro1 [IN alfabeto1]

...ou...

SYMBOLIC CHARACTERS nome1 nome2 ... nomex ARE 
                    inteiro1 inteiro2 ... inteirox
                    [IN alfabeto1]

O COBOL possui algumas constantes figurativas pré-definidas, como ZEROS, HIGH-VALUE, LOW-VALUE, SPACES etc. A cláusula SYMBOLIC CHARACTERS permite que o programador crie suas próprias constantes figurativas para usá-las no programa da mesma forma que usaria as constantes pré-definidas.

A quantidade de parâmetros nomex deve ser igual à quantidade de inteirox, caso a opção ARE seja utilizada.

O GnuCOBOL associará o nome ao caracter correspondente ao inteiro no alfabeto utilizado pelo programa. Por exemplo, supondo que o alfabeto default seja ASCII, a cláusula abaixo criaria uma constante figurativa chamada LF associada ao caracter ao caracter 10 da tabela ASCII, que corresponde ao LINE-FEED:

SYMBOLIC LF IS 10.

E na PROCEDURE, poderia escrever…

MOVE CONCATENATE(REGISTRO, LF) TO LINHA-RELATORIO

Esta cláusula também permite que se faça referência a um alfabeto diferente do alfabeto utilizado pelo programa. Por exemplo, em um “ambiente” ASCII, a sentença abaixo criaria uma constante figurativa chamada LF associada ao caracter 37 da tabela EBCDIC, que correspondente também ao LINE-FEED:

SYMBOLIC LF IS 37 IN EBCDIC.

Exemplo de parágrafo SPECIAL-NAMES

*>=========================================================
environment division.
*>---------------------------------------------------------
configuration section.
special-names.
   decimal-point is comma.
   crt status is ezeaid.
   cursor is ezecursor.