Patch level : 2.1 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Stato dell'arte in conversione reports git-svn-id: svn://10.65.10.50/trunk@12060 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
2b34881fe3
commit
d0cad3f608
15
ba/alex.alx
15
ba/alex.alx
@ -1,3 +1,7 @@
|
|||||||
|
: 2DROP ( n1 n2 -- )
|
||||||
|
DROP DROP
|
||||||
|
;
|
||||||
|
|
||||||
: 2DUP ( n1 n2 -- n1 n2 n1 n2 )
|
: 2DUP ( n1 n2 -- n1 n2 n1 n2 )
|
||||||
OVER OVER
|
OVER OVER
|
||||||
;
|
;
|
||||||
@ -14,10 +18,15 @@
|
|||||||
SWAP OVER
|
SWAP OVER
|
||||||
;
|
;
|
||||||
|
|
||||||
: +! ( n1 a1 -- )
|
: +! ( a1 n1 -- ) \ Incrementa la variabile a1 di n1
|
||||||
DUP @ ROT + !
|
DUP
|
||||||
|
IF
|
||||||
|
OVER @ + SWAP !
|
||||||
|
ELSE
|
||||||
|
2DROP
|
||||||
|
THEN
|
||||||
;
|
;
|
||||||
|
|
||||||
: INCR ( a1 -- )
|
: INCR ( a1 -- )
|
||||||
1 SWAP +!
|
1 +!
|
||||||
;
|
;
|
||||||
|
@ -87,7 +87,7 @@ bool TVariant::is_zero() const
|
|||||||
case _datefld: return !as_date().ok();
|
case _datefld: return !as_date().ok();
|
||||||
case _longfld: return _ptr == NULL;
|
case _longfld: return _ptr == NULL;
|
||||||
case _realfld: return as_real().is_zero();
|
case _realfld: return as_real().is_zero();
|
||||||
case _alfafld: return real::is_null(as_string());
|
case _alfafld: return as_string().empty();
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -305,29 +305,24 @@ void TTable_names::fill()
|
|||||||
|
|
||||||
int TTable_names::logic_num(const TString& name)
|
int TTable_names::logic_num(const TString& name)
|
||||||
{
|
{
|
||||||
TString* str = (TString*)_names.objptr(name);
|
if (isdigit(name[0]))
|
||||||
if (str == NULL && isalpha(name[0]))
|
|
||||||
{
|
{
|
||||||
fill();
|
int num = atoi(name);
|
||||||
str = (TString*)_names.objptr(name);
|
if (name[name.len()-1] == '@')
|
||||||
}
|
num = -num;
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name[0] == '%' && name.len() == 4)
|
||||||
|
return LF_TABCOM;
|
||||||
|
|
||||||
|
if (name.len() == 3)
|
||||||
|
return LF_TAB;
|
||||||
|
|
||||||
|
TString* str = (TString*)_names.objptr(name);
|
||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
{
|
{
|
||||||
if (isdigit(name[0]))
|
fill();
|
||||||
{
|
|
||||||
if (name.right(1) == "@")
|
|
||||||
add_file(-atoi(name), name);
|
|
||||||
else
|
|
||||||
add_file(atoi(name), name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (name[0] == '%')
|
|
||||||
add_file(LF_TABCOM, name); else
|
|
||||||
if (name.len() == 3)
|
|
||||||
add_file(LF_TAB, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
str = (TString*)_names.objptr(name);
|
str = (TString*)_names.objptr(name);
|
||||||
}
|
}
|
||||||
return str == NULL ? 0 : atoi(*str);
|
return str == NULL ? 0 : atoi(*str);
|
||||||
@ -628,16 +623,16 @@ const TVariant& TRecordset::get(const char* column_name) const
|
|||||||
column_name++;
|
column_name++;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* dot = strchr(column_name, ':');
|
char* colon = strchr(column_name, ':');
|
||||||
if (dot != NULL)
|
if (colon != NULL)
|
||||||
{
|
{
|
||||||
*dot = '\0';
|
*colon = '\0';
|
||||||
const int i = find_column(column_name);
|
const int i = find_column(column_name);
|
||||||
*dot = ':';
|
*colon = ':';
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
{
|
{
|
||||||
const TString& str = get(i).as_string();
|
const TString& str = get(i).as_string();
|
||||||
TString subfield; subfield << (dot+1) << '=';
|
TString subfield; subfield << (colon+1) << '=';
|
||||||
int s = str.find(subfield);
|
int s = str.find(subfield);
|
||||||
if (s == 0 || (s > 0 && str[s-1] < ' '))
|
if (s == 0 || (s > 0 && str[s-1] < ' '))
|
||||||
{
|
{
|
||||||
@ -1786,16 +1781,29 @@ TVariant& TISAM_recordset::get_tmp_var() const
|
|||||||
return *var;
|
return *var;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TVariant& TISAM_recordset::get(int logic, const char* name) const
|
const TVariant& TISAM_recordset::get(int logic, const char* fldname) const
|
||||||
{
|
{
|
||||||
char* square = strchr(name, '[');
|
TString80 name = fldname;
|
||||||
if (square != NULL) *square = '\0'; // Per il momento tronco il nome
|
TString16 subfield;
|
||||||
|
int from = 1, to = 0;
|
||||||
|
|
||||||
|
const int open_bracket = name.find('[');
|
||||||
|
if (open_bracket > 0)
|
||||||
|
{
|
||||||
|
sscanf((const char*)name + open_bracket, "[%d,%d]", &from, &to);
|
||||||
|
name.cut(open_bracket);
|
||||||
|
}
|
||||||
|
|
||||||
|
const int colon = name.find(':');
|
||||||
|
if (colon > 0)
|
||||||
|
{
|
||||||
|
subfield = name.mid(colon+1);
|
||||||
|
name.cut(colon);
|
||||||
|
}
|
||||||
|
|
||||||
const TRectype& rec = _relation->curr(logic);
|
const TRectype& rec = _relation->curr(logic);
|
||||||
const TFieldtypes ft = rec.type(name);
|
const TFieldtypes ft = rec.type(name);
|
||||||
|
|
||||||
if (square != NULL) *square = '['; // Ripristino il nome
|
|
||||||
|
|
||||||
if (ft == _nullfld)
|
if (ft == _nullfld)
|
||||||
return NULL_VARIANT;
|
return NULL_VARIANT;
|
||||||
|
|
||||||
@ -1810,13 +1818,22 @@ const TVariant& TISAM_recordset::get(int logic, const char* name) const
|
|||||||
default : var.set(rec.get(name)); break;
|
default : var.set(rec.get(name)); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (square != NULL)
|
if (subfield.not_empty())
|
||||||
{
|
{
|
||||||
int from = 0, to = -1;
|
subfield << '=';
|
||||||
sscanf(square, "[%d,%d]", &from, &to);
|
const TString& str = var.as_string();
|
||||||
var.set(var.as_string().sub(from-1, to));
|
int s = str.find(subfield);
|
||||||
|
if (s == 0 || (s > 0 && str[s-1] < ' '))
|
||||||
|
{
|
||||||
|
s += subfield.len();
|
||||||
|
const int e = str.find('\n', s);
|
||||||
|
var.set(str.sub(s, e));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (to >= from)
|
||||||
|
var.set(var.as_string().sub(from-1, to));
|
||||||
|
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ PAGE "Avanzate" -1 -1 50 16
|
|||||||
|
|
||||||
MEMO F_INCLUDE 48 2
|
MEMO F_INCLUDE 48 2
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 0 "Librerie (,) "
|
PROMPT 1 0 "Librerie (separate da ,) "
|
||||||
END
|
END
|
||||||
|
|
||||||
MEMO F_PRESCRIPT 48 6
|
MEMO F_PRESCRIPT 48 6
|
||||||
|
@ -673,13 +673,13 @@ TReport_section::~TReport_section()
|
|||||||
// TReport_script
|
// TReport_script
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TString& TReport_script::translate_message() const
|
TString& TReport_script::translate_message(TReport& rep) const
|
||||||
{
|
{
|
||||||
TToken_string source(_src, '\n');
|
TToken_string source(_src, '\n');
|
||||||
TToken_string line(256, '|');
|
TToken_string line(256, '|');
|
||||||
TToken_string args(256, ',');
|
TToken_string args(256, ',');
|
||||||
TString cmd, fld;
|
TString cmd;
|
||||||
TString& alex = get_tmp_string();
|
TString alex, empty_alex;
|
||||||
FOR_EACH_TOKEN(source, srcrow)
|
FOR_EACH_TOKEN(source, srcrow)
|
||||||
{
|
{
|
||||||
line = srcrow;
|
line = srcrow;
|
||||||
@ -691,36 +691,57 @@ TString& TReport_script::translate_message() const
|
|||||||
{
|
{
|
||||||
line.ltrim(6);
|
line.ltrim(6);
|
||||||
line.trim();
|
line.trim();
|
||||||
alex << "#THIS @ 0= IF ";
|
|
||||||
}
|
}
|
||||||
FOR_EACH_TOKEN(line, tok)
|
FOR_EACH_TOKEN(line, tok)
|
||||||
{
|
{
|
||||||
const TFixed_string msg(tok);
|
const TFixed_string msg(tok);
|
||||||
const int comma = msg.find(',');
|
const int comma = msg.find(',');
|
||||||
if (comma > 0)
|
if (comma > 0)
|
||||||
{
|
{
|
||||||
cmd = msg.left(comma);
|
cmd << msg.left(comma);
|
||||||
args = msg.mid(comma+1);
|
args = msg.mid(comma+1);
|
||||||
fld = args.get(0);
|
if (args[0] != '#') // Controlla se c'e' bisogno di un # all'inizio
|
||||||
if (isdigit(fld[0]) && isdigit(fld[fld.len()-1]))
|
|
||||||
{
|
{
|
||||||
fld.insert("#", 0);
|
char type;
|
||||||
args.add(fld, 0);
|
int level, id;
|
||||||
|
if (rep.parse_field(args.get(0), type, level, id) >= 2)
|
||||||
|
args.insert("#");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cmd = msg;
|
cmd << msg;
|
||||||
args.cut(0);
|
args.cut(0);
|
||||||
fld.cut(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
alex << args << " MESSAGE_" << cmd << ' ';
|
if (cmd[0] != '_')
|
||||||
|
cmd.insert("_");
|
||||||
|
cmd.insert("MESSAGE");
|
||||||
|
if (rep.defined(cmd))
|
||||||
|
{
|
||||||
|
TString& alx = msg_empty ? empty_alex : alex;
|
||||||
|
alx << args << ' ' << cmd << ' ';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmd << " ?";
|
||||||
|
error_box(cmd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (msg_empty)
|
|
||||||
alex << "THEN ";
|
|
||||||
}
|
}
|
||||||
return alex;
|
TString& src = get_tmp_string();
|
||||||
|
if (!empty_alex.blank())
|
||||||
|
{
|
||||||
|
src = "#THIS @ IF\n";
|
||||||
|
src << alex;
|
||||||
|
src << "\nELSE\n";
|
||||||
|
src << empty_alex;
|
||||||
|
src << "\nTHEN";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
src = alex;
|
||||||
|
|
||||||
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -745,7 +766,7 @@ bool TReport_script::compile(TReport& rep)
|
|||||||
|
|
||||||
bool good = true;
|
bool good = true;
|
||||||
if (_src.starts_with("MESSAGE "))
|
if (_src.starts_with("MESSAGE "))
|
||||||
good = rep.compile(translate_message(), *_bc);
|
good = rep.compile(translate_message(rep), *_bc);
|
||||||
else
|
else
|
||||||
good = rep.compile(_src, *_bc);
|
good = rep.compile(_src, *_bc);
|
||||||
_bc->set_name(_desc);
|
_bc->set_name(_desc);
|
||||||
@ -1363,7 +1384,7 @@ void TReport_field::save(TXmlItem& root) const
|
|||||||
};
|
};
|
||||||
switch (vertical_alignment())
|
switch (vertical_alignment())
|
||||||
{
|
{
|
||||||
case 'T': fld.SetAttr("valign", "top"); break;
|
case 'B': fld.SetAttr("valign", "bottom"); break;
|
||||||
case 'C': fld.SetAttr("valign", "center"); break;
|
case 'C': fld.SetAttr("valign", "center"); break;
|
||||||
default : break;
|
default : break;
|
||||||
};
|
};
|
||||||
@ -1408,7 +1429,7 @@ bool TReport_field::load(const TXmlItem& fld)
|
|||||||
set_back_color(get_col_attr(fld, "bg_color", COLOR_WHITE));
|
set_back_color(get_col_attr(fld, "bg_color", COLOR_WHITE));
|
||||||
set_fore_color(get_col_attr(fld, "fg_color", COLOR_BLACK));
|
set_fore_color(get_col_attr(fld, "fg_color", COLOR_BLACK));
|
||||||
set_horizontal_alignment(get_chr_attr(fld, "align", 'L'));
|
set_horizontal_alignment(get_chr_attr(fld, "align", 'L'));
|
||||||
set_vertical_alignment(get_chr_attr(fld, "valign", 'B'));
|
set_vertical_alignment(get_chr_attr(fld, "valign", 'T'));
|
||||||
set_picture(fld.GetAttr("text"));
|
set_picture(fld.GetAttr("text"));
|
||||||
set_codval(fld.GetAttr("codval"));
|
set_codval(fld.GetAttr("codval"));
|
||||||
set_link(fld.GetAttr("link"));
|
set_link(fld.GetAttr("link"));
|
||||||
@ -1787,7 +1808,13 @@ bool TReport::load(const char* fname)
|
|||||||
|
|
||||||
_include = xml.GetAttr("libraries");
|
_include = xml.GetAttr("libraries");
|
||||||
FOR_EACH_TOKEN(_include, lib)
|
FOR_EACH_TOKEN(_include, lib)
|
||||||
include(lib);
|
{
|
||||||
|
TFilename libname = lib;
|
||||||
|
libname.trim();
|
||||||
|
if (libname.find('.') < 0)
|
||||||
|
libname.ext("alx");
|
||||||
|
include(libname);
|
||||||
|
}
|
||||||
|
|
||||||
_prescript.load(xml, "prescript");
|
_prescript.load(xml, "prescript");
|
||||||
_postscript.load(xml, "postscript");
|
_postscript.load(xml, "postscript");
|
||||||
|
@ -111,7 +111,7 @@ class TReport_script : public TObject
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void destroy();
|
void destroy();
|
||||||
TString& translate_message() const;
|
TString& translate_message(TReport& report) const;
|
||||||
void copy(const TReport_script& rs);
|
void copy(const TReport_script& rs);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -394,7 +394,6 @@ protected:
|
|||||||
virtual bool set_usr_val(const TString& name, const TVariant& var);
|
virtual bool set_usr_val(const TString& name, const TVariant& var);
|
||||||
KEY run_form(const TString& msk);
|
KEY run_form(const TString& msk);
|
||||||
|
|
||||||
int parse_field(const char* code, char& type, int& level, int& id) const;
|
|
||||||
bool do_message(const TVariant& var, FLDMSG_FUNC msg, void* jolly);
|
bool do_message(const TVariant& var, FLDMSG_FUNC msg, void* jolly);
|
||||||
|
|
||||||
void build_section_key(char type, int level, TString& key) const;
|
void build_section_key(char type, int level, TString& key) const;
|
||||||
@ -452,6 +451,7 @@ public:
|
|||||||
void set_curr_field(TReport_field* fld) { _curr_field = fld; }
|
void set_curr_field(TReport_field* fld) { _curr_field = fld; }
|
||||||
TReport_field* curr_field() const { return _curr_field; }
|
TReport_field* curr_field() const { return _curr_field; }
|
||||||
|
|
||||||
|
int parse_field(const char* code, char& type, int& level, int& id) const;
|
||||||
TReport_field* field(const TString& code);
|
TReport_field* field(const TString& code);
|
||||||
|
|
||||||
void destroy();
|
void destroy();
|
||||||
|
@ -183,11 +183,9 @@ bool TPrint_preview_window::on_key(KEY k)
|
|||||||
TPrint_preview_window::TPrint_preview_window(int x, int y, int dx, int dy, WINDOW parent,
|
TPrint_preview_window::TPrint_preview_window(int x, int y, int dx, int dy, WINDOW parent,
|
||||||
TWindowed_field* owner, TPage_printer* printer)
|
TWindowed_field* owner, TPage_printer* printer)
|
||||||
: TField_window(x, y, dx, dy, parent, owner), _printer(printer),
|
: TField_window(x, y, dx, dy, parent, owner), _printer(printer),
|
||||||
_page(1), _last(0), _zoom(100)
|
_page(1), _last(0), _zoom(120)
|
||||||
{
|
{
|
||||||
RCT rct; xvt_vobj_get_client_rect(win(), &rct);
|
RCT rct; xvt_vobj_get_client_rect(win(), &rct);
|
||||||
_zoom = 100 * rct.right / 800;
|
|
||||||
|
|
||||||
set_scroll_max(rct.right, rct.bottom);
|
set_scroll_max(rct.right, rct.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
183
ba/ba8304.cpp
183
ba/ba8304.cpp
@ -102,9 +102,8 @@ enum AVM_opcode
|
|||||||
avm_or, avm_over,
|
avm_or, avm_over,
|
||||||
avm_perform, avm_pick, avm_plus_loop, avm_push,
|
avm_perform, avm_pick, avm_plus_loop, avm_push,
|
||||||
avm_repeat, avm_rdrop, avm_rpeek, avm_rpush, avm_roll, avm_rot,
|
avm_repeat, avm_rdrop, avm_rpeek, avm_rpush, avm_roll, avm_rot,
|
||||||
avm_store, avm_sub, avm_swap,
|
avm_strlen, avm_strmid, avm_store, avm_sub, avm_swap,
|
||||||
avm_then, avm_tok_fetch, avm_tok_store,
|
avm_then, avm_tok_fetch, avm_tok_store,
|
||||||
avm_strlen, avm_strmid,
|
|
||||||
avm_until, avm_usrword,
|
avm_until, avm_usrword,
|
||||||
avm_variable,
|
avm_variable,
|
||||||
avm_warm, avm_while,
|
avm_warm, avm_while,
|
||||||
@ -120,18 +119,19 @@ const char* AVM_TOKENS[avm_zzz+1] =
|
|||||||
"=", ">", ">=", "<", "<=", "<>", "NULL=", "0=",
|
"=", ">", ">=", "<", "<=", "<>", "NULL=", "0=",
|
||||||
"DIV", "/", "DO", ".", "DROP", "DUP",
|
"DIV", "/", "DO", ".", "DROP", "DUP",
|
||||||
"ELSE",
|
"ELSE",
|
||||||
"FALSE", "@", "FORGET",
|
"@", "FORGET",
|
||||||
"I", "IF", "INCLUDE",
|
"I", "IF", "INCLUDE",
|
||||||
"J",
|
"J",
|
||||||
"LOOP",
|
"LOOP",
|
||||||
"MOD", "MON", "*",
|
"MOD", "MON", "*",
|
||||||
"NEGATE",
|
"NEGATE", "NULL",
|
||||||
"OR", "OVER",
|
"OR", "OVER",
|
||||||
"PERFORM", "PICK", "+LOOP", "PUSH",
|
"PERFORM", "PICK", "+LOOP", "PUSH",
|
||||||
"REPEAT", "R>", "R@", ">R", "ROLL", "ROT",
|
"REPEAT", "R>", "R@", ">R", "ROLL", "ROT",
|
||||||
"STRLEN", "STRMID", "!", "-", "SWAP",
|
"STRLEN", "STRMID", "!", "-", "SWAP",
|
||||||
"THEN", "TOK@", "TOK!", "TRUE",
|
"THEN", "TOK@", "TOK!",
|
||||||
"UNTIL", "#",
|
"UNTIL", "$USR$",
|
||||||
|
"VARIABLE",
|
||||||
"WARM", "WHILE"
|
"WARM", "WHILE"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -155,6 +155,7 @@ public:
|
|||||||
TAVM_op(AVM_opcode o, const TString& str);
|
TAVM_op(AVM_opcode o, const TString& str);
|
||||||
TAVM_op(AVM_opcode o, const real& num);
|
TAVM_op(AVM_opcode o, const real& num);
|
||||||
TAVM_op(AVM_opcode o, const long num);
|
TAVM_op(AVM_opcode o, const long num);
|
||||||
|
TAVM_op(const TAVM_op& op);
|
||||||
TAVM_op(AVM_opcode o);
|
TAVM_op(AVM_opcode o);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -173,21 +174,25 @@ void TAVM_op::set_auto_break(bool on)
|
|||||||
|
|
||||||
|
|
||||||
TAVM_op::TAVM_op(AVM_opcode o, const TString& str)
|
TAVM_op::TAVM_op(AVM_opcode o, const TString& str)
|
||||||
: _op(o), _var(str), _break_pointer(false)
|
: _op(o), _var(str), _break_pointer(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
TAVM_op::TAVM_op(AVM_opcode o, const real& num)
|
TAVM_op::TAVM_op(AVM_opcode o, const real& num)
|
||||||
: _op(o), _var(num), _break_pointer(false)
|
: _op(o), _var(num), _break_pointer(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
TAVM_op::TAVM_op(AVM_opcode o, const long num)
|
TAVM_op::TAVM_op(AVM_opcode o, const long num)
|
||||||
: _op(o), _var(num), _break_pointer(false)
|
: _op(o), _var(num), _break_pointer(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
TAVM_op::TAVM_op(AVM_opcode o)
|
TAVM_op::TAVM_op(AVM_opcode o)
|
||||||
: _op(o), _break_pointer(false)
|
: _op(o), _break_pointer(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
TAVM_op::TAVM_op(const TAVM_op& op) : _op(op._op), _var(op._var), _break_pointer(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TAVM_monitor
|
// TAVM_monitor
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -446,7 +451,7 @@ protected:
|
|||||||
void do_call(const TString& func);
|
void do_call(const TString& func);
|
||||||
|
|
||||||
const TString_array& get_user_words();
|
const TString_array& get_user_words();
|
||||||
int compile_user_word(const TString& n);
|
int compile_user_word(const char* n);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const TString& get_last_error() const { return _last_error; }
|
const TString& get_last_error() const { return _last_error; }
|
||||||
@ -457,8 +462,8 @@ public:
|
|||||||
bool do_include(const char* fname);
|
bool do_include(const char* fname);
|
||||||
TVariant& do_fetch(const TString& name);
|
TVariant& do_fetch(const TString& name);
|
||||||
void do_store(const TString& name);
|
void do_store(const TString& name);
|
||||||
|
|
||||||
void set_interactive(bool inter) { _interactive = inter; }
|
void set_interactive(bool inter) { _interactive = inter; }
|
||||||
|
bool defined(const char* w);
|
||||||
|
|
||||||
TAVM(TAlex_virtual_machine* vm);
|
TAVM(TAlex_virtual_machine* vm);
|
||||||
virtual ~TAVM();
|
virtual ~TAVM();
|
||||||
@ -547,7 +552,7 @@ const TString_array& TAVM::get_user_words()
|
|||||||
return _user_words;
|
return _user_words;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TAVM::compile_user_word(const TString& w)
|
int TAVM::compile_user_word(const char* w)
|
||||||
{
|
{
|
||||||
const TString_array& uw = get_user_words();
|
const TString_array& uw = get_user_words();
|
||||||
const int i = uw.find(w);
|
const int i = uw.find(w);
|
||||||
@ -581,7 +586,7 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
|
|||||||
{
|
{
|
||||||
TBytecode* bc = new TBytecode;
|
TBytecode* bc = new TBytecode;
|
||||||
bc->set_name(str);
|
bc->set_name(str);
|
||||||
_words.add(str, bc);
|
_words.add(str, bc, true);
|
||||||
compile(instr, *bc);
|
compile(instr, *bc);
|
||||||
op = new TAVM_op(avm_nop);
|
op = new TAVM_op(avm_nop);
|
||||||
}
|
}
|
||||||
@ -610,69 +615,78 @@ bool TAVM::compile(istream& instr, TBytecode& bytecode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const AVM_opcode oc = token2opcode(str);
|
const int oc = compile_user_word(str);
|
||||||
if (oc != avm_nop)
|
if (oc > 0)
|
||||||
{
|
op = new TAVM_op(avm_usrword, oc);
|
||||||
switch (oc)
|
|
||||||
{
|
|
||||||
case avm_else:
|
|
||||||
if (find_matching(bytecode, avm_if) < 0)
|
|
||||||
{
|
|
||||||
_last_error = "ELSE without matching IF";
|
|
||||||
log_error(_last_error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
op = new TAVM_op(oc);
|
|
||||||
break;
|
|
||||||
case avm_then:
|
|
||||||
if (find_matching(bytecode, avm_if, avm_else) < 0)
|
|
||||||
{
|
|
||||||
_last_error = "THEN without matching IF";
|
|
||||||
log_error(_last_error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
op = new TAVM_op(oc);
|
|
||||||
break;
|
|
||||||
case avm_loop:
|
|
||||||
case avm_plus_loop:
|
|
||||||
{
|
|
||||||
const do_pos = find_matching(bytecode, avm_do);
|
|
||||||
if (do_pos < 0)
|
|
||||||
{
|
|
||||||
_last_error.cut(0) << str << " without matching DO";
|
|
||||||
log_error(_last_error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
op = new TAVM_op(oc, do_pos);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case avm_repeat:
|
|
||||||
case avm_until:
|
|
||||||
{
|
|
||||||
const int begin_pos = find_matching(bytecode, avm_begin);
|
|
||||||
if (begin_pos < 0)
|
|
||||||
{
|
|
||||||
_last_error.cut(0) << str << " without matching BEGIN";
|
|
||||||
log_error(_last_error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
find_matching(bytecode, avm_while);
|
|
||||||
op = new TAVM_op(oc, begin_pos);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case avm_call_word:
|
|
||||||
op = new TAVM_op(oc, str);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
op = new TAVM_op(oc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const int oc = compile_user_word(str);
|
const AVM_opcode oc = token2opcode(str);
|
||||||
if (oc > 0)
|
if (oc != avm_nop)
|
||||||
op = new TAVM_op(avm_usrword, oc);
|
{
|
||||||
|
switch (oc)
|
||||||
|
{
|
||||||
|
case avm_else:
|
||||||
|
if (find_matching(bytecode, avm_if) < 0)
|
||||||
|
{
|
||||||
|
_last_error = "ELSE without matching IF";
|
||||||
|
log_error(_last_error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
op = new TAVM_op(oc);
|
||||||
|
break;
|
||||||
|
case avm_then:
|
||||||
|
if (find_matching(bytecode, avm_if, avm_else) < 0)
|
||||||
|
{
|
||||||
|
_last_error = "THEN without matching IF";
|
||||||
|
log_error(_last_error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
op = new TAVM_op(oc);
|
||||||
|
break;
|
||||||
|
case avm_loop:
|
||||||
|
case avm_plus_loop:
|
||||||
|
{
|
||||||
|
const do_pos = find_matching(bytecode, avm_do);
|
||||||
|
if (do_pos < 0)
|
||||||
|
{
|
||||||
|
_last_error.cut(0) << str << " without matching DO";
|
||||||
|
log_error(_last_error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
op = new TAVM_op(oc, do_pos);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case avm_repeat:
|
||||||
|
case avm_until:
|
||||||
|
{
|
||||||
|
const int begin_pos = find_matching(bytecode, avm_begin);
|
||||||
|
if (begin_pos < 0)
|
||||||
|
{
|
||||||
|
_last_error.cut(0) << str << " without matching BEGIN";
|
||||||
|
log_error(_last_error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
find_matching(bytecode, avm_while);
|
||||||
|
op = new TAVM_op(oc, begin_pos);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case avm_call_word:
|
||||||
|
{
|
||||||
|
const TBytecode* bc = (const TBytecode*)_words.objptr(str);
|
||||||
|
if (bc != NULL && bc->items() == 1)
|
||||||
|
{
|
||||||
|
const TAVM_op* inline_op = (const TAVM_op*)bc->objptr(0);
|
||||||
|
op = new TAVM_op(*inline_op);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
op = new TAVM_op(oc, str);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
op = new TAVM_op(oc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (op != NULL)
|
if (op != NULL)
|
||||||
@ -717,7 +731,7 @@ void TAVM::do_call(const TString& func)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_last_error = func; _last_error << " ???";
|
_last_error = func; _last_error << " ?";
|
||||||
log_error(_last_error);
|
log_error(_last_error);
|
||||||
_bc = NULL;
|
_bc = NULL;
|
||||||
}
|
}
|
||||||
@ -772,6 +786,14 @@ void TAVM::do_store(const TString& name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TAVM::defined(const char* name)
|
||||||
|
{
|
||||||
|
if (_words.objptr(name) != NULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return compile_user_word(name) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
void TAVM::execute(const TAVM_op& op)
|
void TAVM::execute(const TAVM_op& op)
|
||||||
{
|
{
|
||||||
switch(op.op())
|
switch(op.op())
|
||||||
@ -1018,7 +1040,11 @@ bool TAVM::execute(const TBytecode& cmdline, ostream* outstr)
|
|||||||
if (str == cmdline.name())
|
if (str == cmdline.name())
|
||||||
_bc = &cmdline;
|
_bc = &cmdline;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_bc = (const TBytecode*)_words.objptr(str);
|
_bc = (const TBytecode*)_words.objptr(str);
|
||||||
|
if (_bc == NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1228,6 +1254,11 @@ bool TAlex_virtual_machine::include(const char* fname)
|
|||||||
void TAlex_virtual_machine::set_interactive(bool inter)
|
void TAlex_virtual_machine::set_interactive(bool inter)
|
||||||
{ avm().set_interactive(inter); }
|
{ avm().set_interactive(inter); }
|
||||||
|
|
||||||
|
bool TAlex_virtual_machine::defined(const char* name)
|
||||||
|
{
|
||||||
|
return avm().defined(name);
|
||||||
|
}
|
||||||
|
|
||||||
TAlex_virtual_machine::TAlex_virtual_machine() : _avm(NULL)
|
TAlex_virtual_machine::TAlex_virtual_machine() : _avm(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ public:
|
|||||||
void warm_restart();
|
void warm_restart();
|
||||||
void cold_restart();
|
void cold_restart();
|
||||||
void set_interactive(bool inter);
|
void set_interactive(bool inter);
|
||||||
|
bool defined(const char* name);
|
||||||
|
|
||||||
TAlex_virtual_machine();
|
TAlex_virtual_machine();
|
||||||
virtual ~TAlex_virtual_machine();
|
virtual ~TAlex_virtual_machine();
|
||||||
|
@ -78,7 +78,19 @@ void TFormer_mask::parse_field_line(const TString& line, TReport_field& rf) cons
|
|||||||
|
|
||||||
if (head.starts_with("FI"))
|
if (head.starts_with("FI"))
|
||||||
{
|
{
|
||||||
rf.set_field(head.get(1));
|
TString fld = head.get(1);
|
||||||
|
if (_doc)
|
||||||
|
{
|
||||||
|
if (fld.find("->") < 0)
|
||||||
|
fld.insert("33->");
|
||||||
|
if (fld.starts_with("33->"))
|
||||||
|
{
|
||||||
|
const TRectype doc(LF_DOC);
|
||||||
|
if (doc.type((const char*)fld + 4) == _nullfld)
|
||||||
|
fld.insert("G1:", 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rf.set_field(fld);
|
||||||
} else
|
} else
|
||||||
if (head.starts_with("FL"))
|
if (head.starts_with("FL"))
|
||||||
{
|
{
|
||||||
@ -89,6 +101,10 @@ void TFormer_mask::parse_field_line(const TString& line, TReport_field& rf) cons
|
|||||||
{
|
{
|
||||||
case 'D': rf.hide(); rf.deactivate(); break;
|
case 'D': rf.hide(); rf.deactivate(); break;
|
||||||
case 'H': rf.hide(); break;
|
case 'H': rf.hide(); break;
|
||||||
|
case 'U':
|
||||||
|
if (rf.type() == 'V')
|
||||||
|
rf.set_type('P'); // Trasforma da Valuta a Prezzo
|
||||||
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,9 +149,9 @@ void TFormer_mask::import_section(TScanner& scan, TReport_section& rs) const
|
|||||||
const TString16 str_type = head.get(0);
|
const TString16 str_type = head.get(0);
|
||||||
char type = ' ';
|
char type = ' ';
|
||||||
if (str_type.starts_with("FI"))
|
if (str_type.starts_with("FI"))
|
||||||
type = 'I';
|
type = 'I';
|
||||||
if (str_type.starts_with("ST"))
|
else
|
||||||
type = 'S';
|
type = str_type[0];
|
||||||
|
|
||||||
if (type > ' ')
|
if (type > ' ')
|
||||||
{
|
{
|
||||||
@ -156,6 +172,8 @@ void TFormer_mask::import_section(TScanner& scan, TReport_section& rs) const
|
|||||||
else
|
else
|
||||||
cur_field->set_height(height);
|
cur_field->set_height(height);
|
||||||
}
|
}
|
||||||
|
if (strchr("NVP", type) != NULL)
|
||||||
|
cur_field->set_horizontal_alignment('R');
|
||||||
|
|
||||||
rs.add(cur_field);
|
rs.add(cur_field);
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
: GET_POS.Y ( f1 -- n1 ) GET_POS NIP ;
|
: GET_POS.Y ( f1 -- n1 ) GET_POS NIP ;
|
||||||
|
|
||||||
|
: GET_SIZE.X ( f1 -- n1 ) GET_POS DROP ;
|
||||||
|
|
||||||
: GET_SIZE.Y ( f1 -- n1 ) GET_SIZE NIP ;
|
: GET_SIZE.Y ( f1 -- n1 ) GET_SIZE NIP ;
|
||||||
|
|
||||||
: GET_BOTTOM ( f1 -- n1 )
|
: GET_BOTTOM ( f1 -- n1 )
|
||||||
@ -47,17 +49,18 @@
|
|||||||
|
|
||||||
: MESSAGE_ALIGN_CENTER ( f1 -- )
|
: MESSAGE_ALIGN_CENTER ( f1 -- )
|
||||||
GET_BOTTOM \ Calcola fondo del campo f1
|
GET_BOTTOM \ Calcola fondo del campo f1
|
||||||
#THIS GET_BOTTOM \ Calcola fonp del campo corrente
|
#THIS GET_BOTTOM \ Calcola fondo del campo corrente
|
||||||
- 2 / \ Calcola offset verticale
|
- 2 / \ Calcola offset verticale
|
||||||
OFFSET_FIELD_POS.Y \ Aggiorna posizione del campo corrente
|
OFFSET_FIELD_POS.Y \ Aggiorna posizione del campo corrente
|
||||||
;
|
;
|
||||||
|
|
||||||
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
||||||
\ Implementazione dei vari messaggi standard
|
\ Implementazione dei vari messaggi standard
|
||||||
|
\ f1 campo o sezione del report
|
||||||
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|
||||||
|
|
||||||
: MESSAGE_ADD ( f1 -- )
|
: MESSAGE_ADD ( f1 -- )
|
||||||
#THIS @ SWAP !
|
#THIS @ +! \ Incrementa f1 col contenuto del campo corrente
|
||||||
;
|
;
|
||||||
|
|
||||||
: MESSAGE_ALIGN ( s1 -- )
|
: MESSAGE_ALIGN ( s1 -- )
|
||||||
@ -69,10 +72,34 @@
|
|||||||
#THIS @ SWAP !
|
#THIS @ SWAP !
|
||||||
;
|
;
|
||||||
|
|
||||||
: MESSAGE_INC ( f1 -- )
|
: MESSAGE_DEBUG
|
||||||
DUP @ 1 + SWAP !
|
MON \ Attiva il fantastico debugger
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_DISABLE ( f1 -- )
|
||||||
|
DISABLE \ User defined word
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_ENABLE ( f1 -- )
|
||||||
|
ENABLE \ User defined word
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_HIDE ( f1 -- )
|
||||||
|
HIDE \ User defined word
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_INCR ( f1 -- )
|
||||||
|
INCR
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_PAGENO ( -- ) \ Numero di pagina corrente
|
||||||
|
#REPORT.PAGE @ THIS !
|
||||||
;
|
;
|
||||||
|
|
||||||
: MESSAGE_RESET ( f1 -- )
|
: MESSAGE_RESET ( f1 -- )
|
||||||
NULL SWAP !
|
NULL SWAP !
|
||||||
;
|
;
|
||||||
|
|
||||||
|
: MESSAGE_SHOW ( f1 -- )
|
||||||
|
SHOW \ User defined word
|
||||||
|
;
|
||||||
|
@ -1,9 +1,30 @@
|
|||||||
: _DESCRIGA
|
\ Messaggi specifici per stampa documenti
|
||||||
#34->DESCR @
|
|
||||||
#DESCLUNGA @ IF
|
: MESSAGE_CLIENTE
|
||||||
#34->DESCEST @
|
DROP
|
||||||
+
|
;
|
||||||
THEN
|
|
||||||
#THIS !
|
: MESSAGE_DESCRIGA
|
||||||
|
#RDOC.DESCR @
|
||||||
|
#RDOC.DESCLUNGA @ IF
|
||||||
|
#RDOC.DESCEST @
|
||||||
|
+
|
||||||
|
THEN
|
||||||
|
#THIS !
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_DITTA
|
||||||
|
DROP
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_RIEPILOGOIVA
|
||||||
|
DROP
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_SCADENZE
|
||||||
|
DROP
|
||||||
|
;
|
||||||
|
|
||||||
|
: MESSAGE_TOTIMPONIBILI
|
||||||
|
DROP
|
||||||
;
|
;
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user