rprop.cpp

来自「eC++编译器源码」· C++ 代码 · 共 138 行

CPP
138
字号
#include <SYSTEM.h>
#include <Chunk.h>
#include <RType.h>
#include <Rtuple.h>
#include <RInterpret.h>
#include <RDB.h>
#include <cstring.h>
#include <stdio.h>
#include <SInOut.h>
#include <cmalloc.h>
#include <SubString.h>
  
  const unsigned int TPROP=14;
  typedef Chunk *pChunk;
  typedef union {  //propertyCount name(<=9 chars) = int or "string"; blanks must be exact
    int value[40]; 
      /*0 propCount 1..max offset to string values-0 if integer
        max+1..max*2 integer values; max*2+1 start of 10-char property names*/
     char names[200];
   } Property;
   typedef char S[10000];
 

unsigned int declare(ADDRESS context, unsigned int requestedWidth) /*returns width in bytes*/
{
  return sizeof(ADDRESS)*2;
};

void invoke(unsigned int method, pStack ps)
{
  pOperand pl,pr;
};

//char getc(char &s[], unsigned int i)
//{
//  return s[i];
//};

boolean inoutc(ADDRESS context, unsigned int method, pTuple p, unsigned int index, unsigned int width, WORD &val[])
{     
  Relation r;
  pChunk c;
  unsigned int j,k,m,n,q;
  long i;
  long *pi;
  S *pss;
  S *ps;
  char s[256];
  pOperand po;
  Property pr, *pPR;

    if (context == NULL) HALT;
    r = Relation(context);
    pi = ADDRESS(p)+LONG(index);
    pss = ADR(val);
    if (method == READ) {
      c = pChunk(RGetExtended(r,0,false));
      pPR = GetS(*c, TRUNC(*pi), i);
      m = pPR->value[0];
      q = 0;
      WriteInt(*pss, q, m, 2);
      q=2;
      k = m*sizeof(int)*4+sizeof(int)*2;
      for (n=1; n<=m; n++) {
        (*pss)[q] = ' '; q++;
        j = k;
        for ( ;; ) {
          (*pss)[q] = pPR->names[j];     //property names at 10 char intervals
          if (pPR->names[j] == '\0') break;
          q++;  j++;
        };
        (*pss)[q] = ' ';
        (*pss)[q+1] = '=';
        (*pss)[q+2] = ' ';
        if (pPR->value[n]==0) {  //numeric property
          WriteInt(*pss, q+3, pPR->value[m+n], 4);
          INC(q, 7);
        } else {
          (*pss)[q+3] = '"';
          INC(q,4);
          j = pPR->value[n];   //offset to string
          for ( ;;j++) {
            q++;
            if (pPR->names[j] == '\0') break;
            (*pss)[q-1] = pPR->names[j];
          };
          (*pss)[q-1] = '"';
        };
        INC(k, 10);
      };
    } else if (method == STORE) { /*NOTE: THERE SHOULD BE A BINARY UPDATE!!*/
    } else if (method == WRITE) {
      c = pChunk(RGetExtended(r,0,false));
      j = Free(*c);
      if (j == 65535) HALT;
      i = LONG(j);
      k = 0;
      *pi = i;
      if (!ReadCard(*pss, k, m)) HALT;
      if (m == 0) HALT;
      pr.value[0] = m;
      q = m*sizeof(int)*4+sizeof(int)*2+m*10
      for (n=1; n<=m; n++) {
        if (!ReadString(*pss, k, s)) break;
        CopyCS(pr.names, m*sizeof(int)*4+sizeof(int)*2+(n-1)*10, 10, s); 
        INC(k,3);
        if ((*pss)[k]!='"') {
          if (!ReadInt(*pss, k, pr.value[m+n])) break;
          pr.value[n] = 0;
        } else {
          pr.value[n] = q;
          for ( ;; ) {
            k++;
            pr.names[q] = (*pss)[k];
            if (pr.names[q]=='"') break;
            q++;
          };
          pr.names[q] = '\0';
          k++;  q++;
        };
      };
      PutS(*c, j, pr, LONG(q+1), true);
    } else if (method == UPDATE) {
    } else if (method == DELETE) {
    } else {
    };
   return true;
  };
/******************************************************************************/

void main(void)
{ char ss[10]; unsigned int i, ints;
  Register("prop", "rprop", TPROP, declare, invoke,inoutc);
  ss[0] = '\0'; i = 0;
  i = 64; Format(TPROP, WRITE, ss, i);
  ints = Id("int");
};

⌨️ 快捷键说明

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