home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / lls_blob.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  3KB  |  132 lines

  1. /* =======================================================================
  2.     LLS_BLOB.c      Generic Singly Linked Lists for Binary Large OBjects.
  3.                     Linked Lists for variable size data-items.
  4.                     This is a 'front end' for the generic LLS module.
  5.  
  6.                     v1.00  94-08-11
  7.  
  8.  _____              This version is Public Domain.
  9.  /_|__|             A.Reitsma, Delft, The Netherlands.
  10. /  | \  --------------------------------------------------------------- */
  11.  
  12. #include <stdlib.h>         /* for malloc()                             */
  13. #include "lls.h"            /* the generic LLS functions ...            */
  14. #include "lls_blob.h"       /* also includes portable.h if necessary    */
  15.  
  16. struct BlobDesc
  17. {
  18.     void * data ;           /* 'data' can be obtained by LLSnodePtr() ! */
  19.     unsigned size ;
  20. };
  21.  
  22. #define ERR_MEMORY          -1
  23.  
  24. /* ---- LL blob system mangement -------------------------------------- */
  25.  
  26. int LLSblobCreate( void )
  27. {
  28.     return LLScreate( sizeof( struct BlobDesc ));
  29. }
  30.  
  31. /* ---- LL blob node mangement ---------------------------------------- */
  32.  
  33. int LLSblobInsert( int List, void * Source, unsigned Size )
  34. {                                       /* insert _BEFORE_ current node */
  35.     struct BlobDesc Blob ;
  36.  
  37.     Blob.size = Size ;
  38.     Blob.data = malloc( Size );
  39.  
  40.     if( NULL == Blob.data )
  41.     {
  42.         return ERR_MEMORY ;
  43.     }
  44.  
  45.     memcpy( Blob.data, Source, Size );
  46.     LLSnodeInsertFrom( List, & Blob );
  47.  
  48.     return LIST_NO_PROBLEMS ;
  49. }
  50.  
  51. int LLSblobAdd( int List, void * Source, unsigned Size )
  52. {                                        /* insert _AFTER_ current node */
  53.     struct BlobDesc Blob ;
  54.  
  55.     Blob.size = Size ;
  56.     Blob.data = malloc( Size );
  57.  
  58.     if( NULL == Blob.data )
  59.     {
  60.         return ERR_MEMORY ;
  61.     }
  62.  
  63.     memcpy( Blob.data, Source, Size );
  64.     LLSnodeAddFrom( List, & Blob );
  65.  
  66.     return LIST_NO_PROBLEMS ;
  67. }
  68.  
  69. int LLSblobPrepend( int List, void * Source, unsigned Size )
  70. {                                               /* insert as first node */
  71.     struct BlobDesc Blob ;
  72.  
  73.     Blob.size = Size ;
  74.     Blob.data = malloc( Size );
  75.  
  76.     if( NULL == Blob.data )
  77.     {
  78.         return ERR_MEMORY ;
  79.     }
  80.  
  81.     memcpy( Blob.data, Source, Size );
  82.     LLSnodePrependFrom( List, & Blob );
  83.  
  84.     return LIST_NO_PROBLEMS ;
  85. }
  86.  
  87. int LLSblobAppend( int List, void * Source, unsigned Size )
  88. {                                                /* insert as last node */
  89.     struct BlobDesc Blob ;
  90.  
  91.     Blob.size = Size ;
  92.     Blob.data = malloc( Size );
  93.  
  94.     if( NULL == Blob.data )
  95.     {
  96.         return ERR_MEMORY ;
  97.     }
  98.  
  99.     memcpy( Blob.data, Source, Size );
  100.     LLSnodeAppendFrom( List, & Blob );
  101.  
  102.     return LIST_NO_PROBLEMS ;
  103. }
  104.  
  105. void LLSblobDelete( int List )
  106. {
  107.     struct BlobDesc Blob ;
  108.  
  109.     LLSnodeDataTo( List, & Blob );
  110.     free( Blob.data );
  111.  
  112.     LLSnodeDelete( List );
  113.  
  114.     return ;
  115. }
  116.  
  117. /* ---- stored data management ---------------------------------------- */
  118.  
  119. unsigned LLSblobData( int List, void * Destination )
  120. {
  121.     struct BlobDesc Blob ;
  122.  
  123.     LLSnodeDataTo( List, & Blob );
  124.  
  125.     if( NULL != Destination )
  126.         memcpy( Destination, Blob.data, Blob.size );
  127.  
  128.     return Blob.size ;       /* size needed for blob */
  129. }
  130.  
  131. /* ==== LLS_BLOB.c  end =============================================== */
  132.