Integração do GnuCOBOL com o C
O compilador do GnuCOBOL transforma um programa fonte escrito em COBOL em um programa fonte escrito em C. Logo em seguida, compila e linkedita esse programa em C e gera um binário executável. A integração entre programas GnuCOBOL e C, portanto, não é complicada.
Mas essa integração exige atenção a alguns detalhes, relacionados principalmente passagem de parâmetros entre programas.
Diferenças no método de alocação de strings
Tanto o C quanto o GnuCOBOL alocam strings em memória como uma sequência de caracteres de tamanho fixo.
No COBOL, strings são alocadas com um tamanho fixo definido pela cláusula PICTURE, como no exemplo abaixo:
01 lastname pic x(015).
O C não possui um datatype string; ele considera que uma string é um um array de char onde cada elemento do array é um caracter. Da mesma forma que no COBOL, esse array tem um tamanho fixo. Em C, o exemplo acima poderia ser definido assim:
char lastname[15];
No entanto, para saber onde termina a string, o C espera encontrar um caracter nulo (x’00’) no final do array.
Ao enviar uma string como parâmetro para um subprograma em C, o programador deve atentar para esse detalhe e concatenar esse caracter nulo no final da string.
Por exemplo, se você quiser chamar um subprograma em C chamado “subc” passando um argumento pic x(020) chamado “param”:
... 01 param pic x(020). ... string param x'00' delimited by size into param call subc using param
Correspondência entre datatypes do C e datatypes do GnuCOBOL
Além dessa diferença no tratamento de strings, a troca de parâmetros entre um programa GnuCOBOL e um programa C também precisa considerar a correspondência entre os tipos de dados disponíveis nas duas linguagens.
A tabela abaixo mostra essa correspondência.
COBOL Usage | Espaço ocupado (em bytes) | Correspondente em C |
---|---|---|
BINARY-CHAR BINARY-CHAR UNSIGNED | 1 | unsigned char |
BINARY-CHAR SIGNED | 1 | signed char |
BINARY-SHORT BINARY-SHORT UNSIGNED | 2 | unsigned unsigned int unsigned short unsigned short int |
BINARY-SHORT SIGNED | 2 | int short short int signed int signed short signed short int |
BINARY-LONG BINARY-LONG UNSIGNED | 4 | unsigned long unsigned long int |
BINARY-LONG SIGNED BINARY-INT | 4 | long long int signed long signed long int |
BINARY-C-LONG SIGNED | 8 | long |
BINARY-DOUBLE BINARY-DOUBLE UNSIGNED | 8 | unsigned long long unsigned long long int |
BINARY-DOUBLE SIGNED BINARY-LONG-LONG | 8 | long long int signed long long int |
COMPUTATIONAL-1 | 4 | float |
COMPUTATIONAL-2 | 8 | double |
Sem equivalente no GnuCOBOL | 12 | long double |
Os USAGEs mostrados na tabela anterior seguem o padrão ANSI 2002 e devem ser usados sem PICTURE, como nos exemplos abaixo:
01 VARIAVEL-A USAGE BINARY-LONG SIGNED. 01 VARIAVEL-B USAGE BINARY-DOUBLE.
Fonte
CUTLER, Gary. Gnu COBOL 2.0 Programmers Guide. 2nd Edition. GNU General Public License, 2013.