buffer_get.c
author "Tomas Zeman <tomas.zeman@sun.com>"
Fri, 19 Oct 2007 11:01:15 +0200
changeset 0 eeadadee24f6
permissions -rw-r--r--
Imported cdb-0.75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     1
#include "buffer.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     2
#include "byte.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     3
#include "error.h"
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     4
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     5
static int oneread(int (*op)(),int fd,char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     6
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     7
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     8
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
     9
  for (;;) {
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    10
    r = op(fd,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    11
    if (r == -1) if (errno == error_intr) continue;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    12
    return r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    13
  }
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    14
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    15
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    16
static int getthis(buffer *s,char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    17
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    18
  if (len > s->p) len = s->p;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    19
  s->p -= len;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    20
  byte_copy(buf,len,s->x + s->n);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    21
  s->n += len;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    22
  return len;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    23
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    24
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    25
int buffer_feed(buffer *s)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    26
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    27
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    28
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    29
  if (s->p) return s->p;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    30
  r = oneread(s->op,s->fd,s->x,s->n);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    31
  if (r <= 0) return r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    32
  s->p = r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    33
  s->n -= r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    34
  if (s->n > 0) byte_copyr(s->x + s->n,r,s->x);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    35
  return r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    36
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    37
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    38
int buffer_bget(buffer *s,char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    39
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    40
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    41
 
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    42
  if (s->p > 0) return getthis(s,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    43
  if (s->n <= len) return oneread(s->op,s->fd,buf,s->n);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    44
  r = buffer_feed(s); if (r <= 0) return r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    45
  return getthis(s,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    46
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    47
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    48
int buffer_get(buffer *s,char *buf,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    49
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    50
  int r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    51
 
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    52
  if (s->p > 0) return getthis(s,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    53
  if (s->n <= len) return oneread(s->op,s->fd,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    54
  r = buffer_feed(s); if (r <= 0) return r;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    55
  return getthis(s,buf,len);
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    56
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    57
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    58
char *buffer_peek(buffer *s)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    59
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    60
  return s->x + s->n;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    61
}
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    62
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    63
void buffer_seek(buffer *s,unsigned int len)
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    64
{
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    65
  s->n += len;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    66
  s->p -= len;
eeadadee24f6 Imported cdb-0.75
"Tomas Zeman <tomas.zeman@sun.com>"
parents:
diff changeset
    67
}