comparison dmres.c @ 439:bc1da1f4cb4b

Implement fwrite and fputc in memio resources. They will only operate on pre-allocated memory area, thus not grow-as-write.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 04 Nov 2012 03:18:42 +0200
parents 3d9c044ec08d
children b60220fd1669
comparison
equal deleted inserted replaced
438:c1f6def0c1da 439:bc1da1f4cb4b
464 464
465 static int dm_mem_fgetc(DMResource * f) 465 static int dm_mem_fgetc(DMResource * f)
466 { 466 {
467 // Check for EOF 467 // Check for EOF
468 if ((size_t) f->dataOffset < f->dataSize) 468 if ((size_t) f->dataOffset < f->dataSize)
469 return (int) f->data[f->dataOffset++]; 469 return f->data[f->dataOffset++];
470 else 470 else
471 return EOF; 471 return EOF;
472 } 472 }
473 473
474 474
485 485
486 memcpy(buf, f->data + f->dataOffset, length); 486 memcpy(buf, f->data + f->dataOffset, length);
487 f->dataOffset += length; 487 f->dataOffset += length;
488 return nmemb; 488 return nmemb;
489 } 489 }
490
491
492 static int dm_mem_fputc(int ch, DMResource * f)
493 {
494 // Check for EOF
495 if ((size_t) f->dataOffset < f->dataSize)
496 {
497 f->data[f->dataOffset++] = ch;
498 return ch;
499 }
500 else
501 return EOF;
502 }
503
504
505 static size_t dm_mem_fwrite(void *buf, size_t size, size_t nmemb, DMResource * f)
506 {
507 size_t length = (size * nmemb);
508
509 // Check if we can write the whole chunk
510 if (((size_t) f->dataOffset + length) >= f->dataSize)
511 {
512 nmemb = (f->dataSize - f->dataOffset) / size;
513 length = size * nmemb;
514 }
515
516 if (length > 0)
517 {
518 memcpy(f->data + f->dataOffset, buf, length);
519 f->dataOffset += length;
520 }
521 return nmemb;
522 }
523
490 524
491 525
492 #ifdef DM_USE_PACKFS 526 #ifdef DM_USE_PACKFS
493 DMResourceOps dfPackFileOps = 527 DMResourceOps dfPackFileOps =
494 { 528 {
515 dm_mem_fseek, 549 dm_mem_fseek,
516 dm_mem_fsize, 550 dm_mem_fsize,
517 dm_mem_ftell, 551 dm_mem_ftell,
518 dm_mem_feof, 552 dm_mem_feof,
519 dm_mem_fgetc, 553 dm_mem_fgetc,
520 NULL, 554 dm_mem_fputc,
521 dm_mem_fread, 555 dm_mem_fread,
522 NULL, 556 dm_mem_fwrite,
523 557
524 NULL, 558 NULL,
525 NULL, 559 NULL,
526 NULL 560 NULL
527 }; 561 };