⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sds_record.c

📁 这是一个Linux下的集成开发环境
💻 C
字号:
/* $Header: /cvsroot/sourcenav/src/snavigator/demo/c++_demo/sds/sds_record.c,v 1.1.1.1 2002/04/18 23:35:32 mdejong Exp $ */#if defined(vms)#include "sdsgen.h"#include "sds_externs.h"#else#if ! defined(__GCC_2__)#include <stddef.h>#endif#include "Sds/sdsgen.h"#include "Sds/sds_externs.h"#endif#if !defined(VXWORKS)#include <memory.h>#include <malloc.h>#endif#include <stdlib.h>#include <string.h>/* forward declarations */char sds_get_align(sds_handle, sds_code);int  put_in_order(sds_record_handle *, struct record_entry *);sds_record_handle *sds_begin_record(name)char *name;{  struct record_header *rh =       (struct record_header *)calloc(1,sizeof(struct record_header));  rh->recent_head =       (struct record_entry *)calloc(1, sizeof(struct record_entry));  rh->recent_tail =   rh->recent_head->next =       (struct record_entry *)calloc(1,sizeof(struct record_entry));  rh->recent_head->next->next = NULL;  rh->record_depth = 0;  rh->recent_head->elemtype = START_RECORD;  if (name != NULL && strlen(name) != 0)  {    rh->recent_head->name = malloc(strlen(name) + 1);    strcpy(rh->recent_head->name,name);  }  rh->hier_head = (struct hier_list *)calloc(1,sizeof(struct hier_list));  rh->hier_head->next = NULL;  rh->hier_head->start = rh->recent_head;  rh->unmatched_endmarks = 0;  rh->nrecs = 0;  rh->stopped = 0;  return rh;}sds_handlesds_end_and_declare(rh, sds)sds_record_handle *rh;sds_handle sds;{  struct type_list *tl;  struct hier_list *hprev,*h = rh->hier_head;  struct record_entry *r;  int tl_count;  int depth;  sds_handle object;  char buffer[4096];  if (h == NULL)    {        sds_push_error(SDS_NO_SUCH_OBJ,SDS_ERROR,"Record handle is null");        return 0L;    }  if (rh->unmatched_endmarks != 0)    {        sds_push_error(SDS_NOT_DEFINABLE,SDS_ERROR,"Record def incomplete");        return 0L;    }  if (!rh->stopped)  {    sds_end_sub_record(rh);    rh->stopped = 1;  }  tl = (struct type_list *)sds_malloc((rh->nrecs + 2) * sizeof(struct type_list));  while (h != NULL)  {    r = h->start;    buffer[0] = 0;    tl_count = 0;    r = r->next;    depth = r->record_depth;    while(r->elemtype != END_RECORD)    {      if (r->record_depth == depth && r->elemtype != END_P_RECORD)      {        tl[tl_count].nelems = r->number;        tl[tl_count++].elemcod = r->elemtype;        if (r->name != NULL)        {          strcat(buffer,r->name);          strcat(buffer,",");        }      }      r = r->next;    }    r->elemtype = END_P_RECORD;    buffer[strlen(buffer)] = 0;    tl[tl_count++].elemcod = SDS_RETLIST;    tl[tl_count++].elemcod = SDS_ENDLIST;    h->start->elemtype = sds_define_structure(sds,tl,buffer);    h->start->number = 1;    hprev = h;    h = h->next;  }  object = sds_declare_structure(sds,rh,                  rh->recent_head->name,1,hprev->start->elemtype);  sds_set_object_type(sds,object,SDS_RECORDS);  free(tl);  return 1;}voidsds_begin_sub_record(rh, name)sds_record_handle *rh;char *name;{  struct record_entry *r = rh->recent_tail;  r->record_depth =  rh->record_depth++;  r->elemtype = START_RECORD;  if (name != NULL && strlen(name) != 0)  {    r->name = (char *)malloc(strlen(name) + 1);    strcpy(r->name,name);  }  rh->recent_tail =   r->next = (struct record_entry *)calloc(1,sizeof(struct record_entry));  r->next->next = NULL;  rh->unmatched_endmarks++;  rh->nrecs++;  put_in_order(rh, r);}voidsds_end_sub_record(rh)sds_record_handle *rh;{  struct record_entry *r = rh->recent_tail;  r->record_depth =  rh->record_depth--;  r->elemtype = END_RECORD;  rh->recent_tail =   r->next = (struct record_entry *)calloc(1,sizeof(struct record_entry));  r->next->next = NULL;  rh->unmatched_endmarks--;}voidsds_record_entry(rh,type,number,pointer, name)sds_record_handle *rh;sds_code type;sds_code number;void *pointer;char *name;{  struct record_entry *r = rh->recent_tail;  r->record_depth =  rh->record_depth;  r->elemtype = type;  r->number = number;  r->pointer = pointer;  if (name != NULL && strlen(name) != 0)  {    r->name = (char *)malloc(strlen(name) + 1);    strcpy(r->name,name);  }  else    r->name = NULL;  rh->recent_tail =   r->next = (struct record_entry *)calloc(1,sizeof(struct record_entry));  r->next->next = NULL;  rh->nrecs++;}void sds_destroy_record_def(rh, object_destroy) /* flag = 0 or 1 */sds_record_handle *rh;int object_destroy;{  struct record_entry *next, *r = rh->recent_head;  struct hier_list *hnext,*h = rh->hier_head;  while(h != NULL)  {    hnext = h->next;    free(h);    h = hnext;  }  while (r != NULL)  {    next = r->next;    if (r->name != NULL)      free(r->name);    if (object_destroy && r->pointer != NULL)      free(r->pointer);    free(r);    r = next;  }  free(rh);}voidsds_print_record_def(rh)sds_record_handle *rh;{  int i = 0;  struct record_entry *next, *r = rh->recent_head;  struct hier_list *hnext,*h = rh->hier_head;  printf("head %lx, tail %lx, depth %d\n",              (unsigned long)rh->recent_head,              (unsigned long)rh->recent_tail, (unsigned)rh->record_depth);  if (rh->unmatched_endmarks == 0)    printf("Record markers match\n");  else    printf("%d unmatched record markers\n", rh->unmatched_endmarks);  while ((next = r->next) != NULL)  {    printf("%d %s,0x%lx of type 0x%lx at 0x%lx; depth %d\n",        i++,        r->name,        (unsigned long)r->number,        (unsigned long)r->elemtype,        (unsigned long)r->pointer,        r->record_depth);    r = next;  }  while((hnext = h->next) != NULL)  {    printf("record %s level %d\n",h->start->name,h->start->record_depth);    h = hnext;  }  printf("record %s level %d\n",h->start->name,h->start->record_depth);}sds_handlesds_write_records(sds_handle sds, int fd, sds_record_handle *rh,                      char *buffer,int size , int *count){  int memcount = 0, padno, esize;  struct record_entry *next, *r = rh->recent_head;  static int padbytes[2] = { 0,0 };  unsigned char align;  sds_handle obsize = sds_element_size(sds,r->elemtype,&align);  while ((next = r->next) != NULL)  {    if (r->elemtype & SDS_INDLIST || r->elemtype < (long)NTYPES)    {      align = sds_get_align(sds, r->elemtype);      if ((padno = align_delta(memcount, align)) != 0)      {        memcount += padno;        sds_buffered(fd,(char *)padbytes, padno,buffer,size,count);      }    }    if (r->elemtype < (long)NTYPES) /* It's a primitive */    {      esize = r->number * (int)(sds_psize(r->elemtype) & 0xff);      memcount += esize;       sds_buffered(fd,r->pointer, esize,buffer,size,count);    }    r = next;  }  /* Finally pad the back end of the object if necessary */  if ((padno = obsize - memcount) > 0)  {    memcount += padno;     sds_buffered(fd,(char *)padbytes, padno,buffer,size,count);  }  sds_flush(fd,buffer,count);  return memcount;}intput_in_order(rh, r)sds_record_handle *rh;struct record_entry *r;{  struct hier_list *hprev = NULL,*hnew,*h = rh->hier_head;  if (h->next != NULL)  {    while (h->next->start->record_depth > r->record_depth)    {      hprev = h;      h = h->next;    }  }  hnew = (struct hier_list *)calloc(1,sizeof(struct hier_list));  hnew->start = r;  hnew->next = h;  if (hprev != NULL)    hprev->next = hnew;  else    rh->hier_head = hnew;  return 0;}char sds_get_align(sds, elemtype)sds_code elemtype;sds_handle sds;{  if (elemtype < (long)NTYPES) /* It's a primitive */     return sds_palign(elemtype);  else  {    struct type_list *tl = sds_tlist(sds);    tl = &tl[(elemtype & ~SDS_INDLIST) + 1];    return (tl->elemcod & 0xff);  }}intsds_buffered(int fd,char *data, int datasize,char *buffer,int size,int *count){  int retno = 0;  if (((datasize + *count) >= size) && (*count > 0))        {  /* Flush what is already there */    sds_flush(fd, buffer, count);                *count = 0;        }  if (datasize >= size)  /* Write it out directly - buffered stuff already flush above */    retno += sds_write(fd, data, datasize);  else  { /* We can buffer it until next time */    memcpy((buffer + *count),data, datasize);    *count += datasize;    retno += datasize;  }  return retno;}intsds_flush(int fd,char *buffer,int *count){  if (*count > 0)  {    int r =  sds_write(fd, buffer, *count);    *count = 0;    return r;  }  return 0;}intsds_copy_records(sds, cptr, rh)sds_handle sds;char *cptr;sds_record_handle *rh;{  int memcount = 0, padno, esize;  struct record_entry *next, *r = rh->recent_head;  unsigned char align;  sds_handle obsize = sds_element_size(sds,r->elemtype,&align);  while ((next = r->next) != NULL)  {    if (r->elemtype & SDS_INDLIST || r->elemtype < (long)NTYPES)    {      align = sds_get_align(sds, r->elemtype);      if ((padno = align_delta(memcount, align)) != 0)      {        memcount += padno;        cptr += padno;      }    }    if (r->elemtype < (long)NTYPES) /* It's a primitive */    {      esize = r->number * (int)(sds_psize(r->elemtype) & 0xff);      memcount += esize;      memcpy(cptr,r->pointer,esize);      cptr += esize;    }    r = next;  }  /* Finally pad the back end of the object if necessary */  if ((padno = obsize - memcount) > 0)  {    memcount += padno;    cptr += padno;  }  return memcount;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -