Exemplo não compilado - Fonte: Programando em C/C++ "A Bíblia" Pág.196

main.html
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
//Exemplo não compilado
//Fonte: Programando em C/C++ "A Bíblia"
//Pág.196
void main(void) {
    union REGS regs_ent, regs_saida;
    struct SREGS segs;
    int i, j;
    int tam_estrutura;
    struct SystemTableEntry {
        struct SystemTableEntry far *proximo;
        unsigned conta_arq;
        unsigned conta_indic;
        unsigned modo_abertura;
        char atributo_arq;
        unsigned local_remoto;
        unsigned far *DPD;
        unsigned agrupamento_inicial;
        unsigned hora;
        unsigned data;
        long tam_arquivo;
        long desloc_atual;
        unsigned agrupamento_relativo;
        long num_setor_diretorio;
        char desloc_entrada_diretorio;
        char nomearq_ext[11];
    } far *tabela_ptr, far *arquivo;

    long far *tabela_sistema;
    //Lê a versão do MS DOS
    regs_ent.x.ax = 0x3001;

    intdos(&regs_ent, &regs_saida);
    if(regs_saida.h.al < 3) {
        printf(
            "Este programa requer o DOS versão 3 ou posterior\n"
        );
        exit(1);
    }
    else if(regs_saida.h.al == 3)
        tam_estrutura = 0x35;
    else if(regs_saida.h.al >= 4)
        tam_estrutura = 0x3B;
    //Lê a lista de ponteiros	
    regs_ent.h.ah = 0x52;
    intdos(&regs_ent, &regs_saida, &segs);
    //O ptr para a tabela de arquivos do sistema está no deslocamento 4
    tabela_sistema=MK_FP(segs.es, regs_saida.x.bx+4);
    tabela_ptr = (struct SystemTableEntry far*) *tabela_sistema;
    do {
        printf("%d entradas na tabela\n", tabela_ptr->conta_arq);
        for(i=0; i<tabela_ptr->conta_arq; i++) {
            arquivo = MK_FP(
                FP_SEG(tabela_ptr),
                FP_OFF(tabela_ptr) + (i+tam_estrutura)
            );
            if(arquivo->conta_indic) {
                for(j=0; j<8; j++)
                    if(arquivo->nomearq_ext[j] != ' ')
                        putchar(arquivo->nomearq_ext[j]);
                    else
                        break;
                if(arquivo->nomearq_ext[8] != ' ')
                    putchar('.');
                for(j=8; j<11; j++)
                    if(arquivo->nomearq_ext[j] != ' ')
                        putchar(arquivo->nomearq_ext[j]);
                printf(
                    "%ld bytes %x atributo %d referências\n",
                    arquivo->tam_arquivo,
                    arquivo->atributo_arq,
                    arquivo->conta_indic
                );
            }
        }
        tabela_ptr = tabela_ptr->proximo;
    } while(FP_OFF(tabela_ptr) != 0xFFFF);
}

Comentários