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 + -
显示快捷键?