Pseudo-FILE

トップ ページ

このメッセージに返信
著者: Frédéric
日付:  
To: Guilde
題目: Pseudo-FILE
Hello,

Afin de pouvoir utiliser une librairie MIDI en C basées sur des fichiers
(FILE), qui utilise fgetc, fputc, fseek, ftell, fread, alors que mes
données sont dans un tableau, j'ai fait un bricolo en implémentant des
fonctions équivalentes mbgetc, mbputc, mbseek, mbtell, mbread.

Mais ça ne fonctionne pas bien, j'ai des résultats douteux...

Ci-joint mon code C ; est-ce qu'il y a un truc flagrant qui vous saute aux
yeux ? Dans la librairie, j'ai juste changé les appels à fxxx en mbxxx.

Merci d'avance.

-- 
    Frédéric

#include "midi-buffer.h"

struct midi_buffer *mbopen(void)  // const char *filename, const char *mode)
{
    struct midi_buffer *mb = malloc(sizeof(struct midi_buffer));
    mb->index = 0;
    mb->size = 0;


    return mb;
}


int mbclose(struct midi_buffer *mb)
{
    free(mb);


    return 0;
}


int mbputc(uint8_t c, struct midi_buffer *mb)
{
    if (mb->size < MIDI_BUFFER_MAX_SIZE) {
        mb->data[mb->index++] = c;
        if (mb->index > mb->size) {
            mb->size = mb->index;
        }


        return c;
    }
    else {
        return EOF;
    }
}


int mbgetc(struct midi_buffer *mb)
{
    if (mb->index < mb->size) {
        uint8_t c = mb->data[mb->index++];


        return c;
    }
    else {
        return EOF;
    }
}


size_t mbread(void *ptr, size_t size, size_t nobj, struct midi_buffer *mb)
{
    char *p = ptr;


    if ((nobj * size) == 0)
        return 0;


    size_t _nobj = 0;
    for (_nobj=0; _nobj<nobj; _nobj++) {
        if (mb->index+size <= mb->size) {
            memcpy(p, &mb->data[mb->index], size);
            mb->index += size;
            p += size;
        }
        else {
            break;
        }
    }


    return _nobj;
}


int mbtell(struct midi_buffer *mb)
{
    return mb->index;
}


int mbseek(struct midi_buffer *mb, long offset, int origin)
{
    uint32_t index;


    switch (origin) {
        case SEEK_SET:
            index = offset;
            break;


        case SEEK_CUR:
            index = mb->index + offset;
            break;


        case SEEK_END:
            index = mb->size - 1 + offset;
            break;


        default:
            index = mb->size;  // to generate error
    }


    if (index >= mb->size) {
        return -1;
    }
    else {
        mb->index = index;


        return 0;
    }
}

#ifndef MIDI_BUFFER_H
#define MIDI_BUFFER_H

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define MIDI_BUFFER_MAX_SIZE 2 * 1024 // 128 * 1024

struct midi_buffer
{
    uint8_t data[MIDI_BUFFER_MAX_SIZE];
    uint32_t index;
    uint32_t size;
};


struct midi_buffer *mbopen(void); // const char *filename, const char *mode);
int mbclose(struct midi_buffer *mb);
int mbputc(uint8_t c, struct midi_buffer *mb);
int mbgetc(struct midi_buffer *mb);
size_t mbread(void *ptr, size_t size, size_t nobj, struct midi_buffer *mb);
int mbtell(struct midi_buffer *mb);
int mbseek(struct midi_buffer *mb, long offet, int origin);

#endif // MIDI_BUFFER_H