Mercurial > hg > dmlib
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 }; |