tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

EbmlBufferWriter.c (2224B)


      1 // #include <strmif.h>
      2 #include "EbmlBufferWriter.h"
      3 #include "EbmlWriter.h"
      4 // #include <cassert>
      5 // #include <limits>
      6 // #include <malloc.h>  //_alloca
      7 #include <stdlib.h>
      8 #include <wchar.h>
      9 #include <string.h>
     10 
     11 void
     12 Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, int buffer_size, unsigned long len)
     13 {
     14  /* buffer_size:
     15   * 1 - int8_t;
     16   * 2 - int16_t;
     17   * 4 - int32_t;
     18   * 8 - int64_t;
     19   */
     20  long i;
     21  for(i = len-1; i >= 0; i--) {
     22    unsigned char x;
     23    if (buffer_size == 1) {
     24      x = (char)(*(const int8_t *)buffer_in >> (i * 8));
     25    } else if (buffer_size == 2) {
     26      x = (char)(*(const int16_t *)buffer_in >> (i * 8));
     27    } else if (buffer_size == 4) {
     28      x = (char)(*(const int32_t *)buffer_in >> (i * 8));
     29    } else if (buffer_size == 8) {
     30      x = (char)(*(const int64_t *)buffer_in >> (i * 8));
     31    }
     32    Ebml_Write(glob, &x, 1);
     33  }
     34 }
     35 
     36 void Ebml_Write(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
     37  unsigned char *src = glob->buf;
     38  src += glob->offset;
     39  memcpy(src, buffer_in, len);
     40  glob->offset += len;
     41 }
     42 
     43 static void _Serialize(EbmlGlobal *glob, const unsigned char *p, const unsigned char *q) {
     44  while (q != p) {
     45    --q;
     46 
     47    memcpy(&(glob->buf[glob->offset]), q, 1);
     48    glob->offset++;
     49  }
     50 }
     51 
     52 /*
     53 void Ebml_Serialize(EbmlGlobal *glob, const void *buffer_in, unsigned long len) {
     54  // assert(buf);
     55 
     56  const unsigned char *const p = (const unsigned char *)(buffer_in);
     57  const unsigned char *const q = p + len;
     58 
     59  _Serialize(glob, p, q);
     60 }
     61 */
     62 
     63 void Ebml_StartSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc, unsigned long class_id) {
     64  unsigned long long unknownLen = 0x01FFFFFFFFFFFFFFLL;
     65  Ebml_WriteID(glob, class_id);
     66  ebmlLoc->offset = glob->offset;
     67  // todo this is always taking 8 bytes, this may need later optimization
     68  Ebml_Serialize(glob, (void *)&unknownLen,sizeof(unknownLen), 8); // this is a key that says length unknown
     69 }
     70 
     71 void Ebml_EndSubElement(EbmlGlobal *glob, EbmlLoc *ebmlLoc) {
     72  unsigned long long size = glob->offset - ebmlLoc->offset - 8;
     73  unsigned long long curOffset = glob->offset;
     74  glob->offset = ebmlLoc->offset;
     75  size |=  0x0100000000000000LL;
     76  Ebml_Serialize(glob, &size,sizeof(size), 8);
     77  glob->offset = curOffset;
     78 }