Skip to content
Snippets Groups Projects
Select Git revision
  • 5bb13c27914804e575b249dec8d08a6025d250e9
  • master default
  • wip-add-ed25519
  • disable-sha1
  • lsh-2.0.4
  • experimental-20050201
  • lsh-1.4.2
  • lsh-1.2
  • lsh_2.1_release_20130626
  • converted-master-branch-to-git
  • nettle_2.4_release_20110903
  • nettle_2.3_release_20110902
  • nettle_2.2_release_20110711
  • nettle_2.1_release_20100725
  • camellia_32bit_20100720
  • nettle_2.0_release_20090608
  • converted-lsh-2.0.4-branch-to-git
  • lsh_2.0.4_release_20070905
  • lsh_2.9_exp_release_20070404
  • nettle_1.15_release_20061128
  • after_experimental_merge_20060516
  • branch_before_experimental_merge_20060516
  • converted-experimental-branch-to-git
  • head_before_experimental_merge_20060516
  • lsh_2.0.3_release_20060509
  • lsh_2.0.2_release_20060127
  • nettle_1.14_release_20051205
  • nettle_1.13_release_20051006
28 results

parse.c

Blame
  • Niels Möller's avatar
    Niels Möller authored
    Rev: src/format.c:1.1
    Rev: src/format.h:1.1
    Rev: src/parse.c:1.1
    Rev: src/parse.h:1.1
    5bb13c27
    History
    parse.c 2.05 KiB
    /* parse.c
     *
     */
    
    #include "parse.h"
    
    void simple_buffer_init(struct simple_buffer *buffer,
    			UINT32 capacity, UINT8 *data)
    {
      buffer->capacity = capacity;
      buffer->pos = 0;
      buffer->data = data;
    }
    
    #define BUFFER_LEFT (buffer->capacity - buffer->pos)
    #define HERE (buffer->data + buffer->pos)
    #define ADVANCE(n) (buffer->pos  += (n))
    
    int parse_uint32(struct simple_buffer *buffer, UINT32 *result)
    {
      if (BUFFER_LEFT < 4)
        return 0;
    
      *result = READ_INT32(HERE);
      ADVANCE(4);
      return 1;
    }
    
    int parse_string(struct simple_buffer *buffer,
    		 UINT32 *length, UINT8 **start)
    {
      UINT32 l;
    
      if (!parse_uint32(buffer, &l))
        return 0;
    
      if (BUFFER_LEFT < length)
        return 0;
    
      *length = l;
      *start = HERE;
      ADVANCE(l);
    }
    
    /* Initializes subbuffer to parse a string from buffer */
    int parse_sub_buffer(struct simple_buffer *buffer,
    		     struct simple_buffer *subbuffer)
    {
      UINT32 length;
      UINT8 *data;
    
      if (!parse_string(buffer, &length, &data))
        return 0;
    
      simple_buffer_init(subbuffer, length, data);
      return 1;
    }
    
    int parse_uint8(struct simple_buffer *buffer, uint8 *result)
    {
      if (!LEFT)
        return 0;
    
      *result = HERE[0];
      ADVANCE(1);
      return 1;
    }
    
    int parse_bignum(struct simple_buffer *buffer, mpz_t result)
    {
      UINT32 length;
      UINT8 *digits;
    
      if (!parse_string(buffer, &length, &data))
        return 0;
    
      /* init mpz */
    #error
    }
    
    /* Returns 1 on success, 0 on failure, and -1 at end of buffer.
     * Unknown atoms sets result to zero. */
    
    /* NOTE: This functions record the fact that it has read to the end of
     * the buffer by setting the position to *beyond* the end of the
     * buffer. */
    int parse_next_atom(struct simple_buffer *buffer, int *result)
    {
      UINT32 i;
    
      if (buffer->pos > buffer->capacity)
        return -1;
    
      for(i = 0; i < left; i++)
        if (HERE[i] == ',')
          {
    	*result = lookup_atom(HERE, i);
    	ADVANCE[i+1];
    	return 1;
          }
    
      *result = lookup(HERE, i);
      ADVANCE(i+1);  /* Beyond end of buffer */
      return 1;
    }
    
    /* Returns success (i.e. 1) iff there is no data left */
    int parse_eod(struct simple_buffer *buffer);
    {
      return !LEFT;
    }