From da54026c24f8a4190932a7b8aa4065d3e4d87a0a Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 16 Aug 1994 16:35:22 +0000 Subject: [PATCH] Aggiunte a ba1 le seguenti funzioni : - Stampa - Esportazione - Importazione - Editing dei file (incorporando ba1300 in ba1100) (ba1300 -> ba1102) git-svn-id: svn://10.65.10.50/trunk@14 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba1100.cpp | 402 +++++++++++++---------- ba/ba1100.h | 39 +-- ba/ba1100d.uml | 358 ++++++++++----------- ba/ba1100f.uml | 25 ++ ba/ba1101.cpp | 391 ++++++++++------------- ba/ba1102.cpp | 272 +++++++++++----- include/files.cpp | 793 +++++++++++++++++++++++++++------------------- include/files.h | 251 ++++++++------- 8 files changed, 1425 insertions(+), 1106 deletions(-) create mode 100755 ba/ba1100f.uml diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index 43ceb5899..cb712fcf2 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,9 +16,10 @@ class BA1100_application : public TApplication { -TDir_sheet * _browse; -TMask * _mask; -long _firm; +TDir_sheet * _browse; +TMask * _mask; +long _firm; +TRec_sheet* _rec; protected: virtual bool menu (MENU_TAG); @@ -30,33 +32,96 @@ virtual bool extended_firm() const { return TRUE; } void update(); void update_dir(); void convert_dir(); +virtual void print(); public: - BA1100_application() : _browse(NULL) {} + BA1100_application() : _browse(NULL), _rec(NULL) {} }; +void BA1100_application::print() + +{ + if (_rec == NULL) return; + const char* table[] = {"", "Alfanumerico", "Intero", "Intero Lungo", + "Reale", "Data", "Intero", "Carattere", + "Booleano", "Intero Zerofilled", + "Intero Lungo Zerofilled"}; + TPrinter& p = printer(); + TPrintrow row; + TToken_string s; + + p.open(); + p.headerlen(6); + p.footerlen(4); + row.reset(); + row.put(format("Lista tracciato %s (%s)", _rec->dir()->des(), + _rec->dir()->name()), 2); + row.put("Pag. @#", 66); + p.setheaderline(2, row); + row.reset(); + row.put("Nome", 7); + row.put("Tipo", 18); + row.put("Lunghezza", 45); + row.put(" Decimali", 55); + row.put("Posizione", 65); + p.setheaderline(4, row); + p.setbackground("l[1,6,75,6]"); + for (int i = 0; i < _rec->rec()->fields(); i ++) + { + row.reset(); + s = _rec->rec()->fielddef(i); + row.put(format("%3d", i + 1), 2); + row.put(s.get(), 7); + row.put(table[s.get_int()], 18); + row.put(format(" %4d", s.get_int()), 45); + row.put(format(" %4d", s.get_int()), 55); + row.put(format(" %4d", _rec->rec()->rec()->Fd[i].RecOff), 65); + p.print(row); + } + p.formfeed(); + row.reset(); + row.put("Espressione chiave", 7); + row.put("Duplicabile", 68); + p.setheaderline(4, row); + for (i = 0; i < _rec->rec()->keys(); i ++) + { + row.reset(); + s = _rec->rec()->keydef(i); + row.put(format("%3d", i + 1), 2); + row.put(s.get(), 7); + row.put(*s.get() == 'X' ? "Si" : "No", 68); + p.print(row); + } + p.formfeed(); + p.close(); +} + bool BA1100_application::create() // initvar e arrmask { - _firm = get_firm(); - _mask = new TMask ("ba1100a"); - set_firm(); - _browse = new TDir_sheet ("Manutenzione file di sistema") ; - _browse->add_button(DLG_INSFILE, "Inserisce", K_F4); - _browse->add_button(DLG_CONVERT, "Converte", K_F7); - _browse->add_button(DLG_ADDFILE, "Aggiunge", K_F8); - dispatch_e_menu(BAR_ITEM(1)); - return TRUE ; + _firm = get_firm(); + _mask = new TMask ("ba1100a"); + set_firm(); + set_printer(new TPrinter()); + _browse = new TDir_sheet ("Manutenzione file di sistema") ; + _browse->add_button(DLG_INSFILE, "Inserisce", K_F4); + _browse->add_button(DLG_CONVERT, "Converte", K_F7); + _browse->add_button(DLG_ADDFILE, "Aggiunge", K_F8); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE ; } bool BA1100_application::destroy() // releasev e arrmask { - if (_firm) set_firm(_firm); - if (_browse != NULL) delete _browse; - delete _mask; - return TRUE ; + TPrinter* p = &printer(); + + delete p; + if (_firm) set_firm(_firm); + if (_browse != NULL) delete _browse; + delete _mask; + return TRUE ; } @@ -84,8 +149,8 @@ void BA1100_application::insert_riga (long riga_sel, TToken_string& riga) _browse->rec()->put (i + 1); } _browse->dir()->set(_mask->get(FLD_NOME), _mask->get_long(FLD_EOD), - _mask->get_long(FLD_FLAG), _mask->get (FLD_DESC), - _mask->get (FLD_FORMULA)); + _mask->get_long(FLD_FLAG), _mask->get (FLD_DESC), + _mask->get (FLD_FORMULA)); _browse->dir()->put(logicnum, _nordir, _sysdirop); _browse->rec()->zero(); _browse->rec()->put(logicnum); @@ -99,8 +164,8 @@ void BA1100_application::insert_riga (long riga_sel, TToken_string& riga) void BA1100_application::edit_riga (long riga_sel, TToken_string& riga) { -KEY tasto; -FileDes dep; +KEY tasto; +FileDes dep; TDir d; const int logicnum = int(riga_sel) + 1; @@ -129,116 +194,119 @@ tasto = _mask->run(); switch (tasto) { - case K_F4: + case K_F4: { - const TFilename filename(_mask->get(FLD_NOME)); + const TFilename filename(_mask->get(FLD_NOME)); - if (logicnum > 1) - { - TEdit_file ef; - ef.browse(logicnum, filename); - } - } - break; - case K_F5: - case K_F6: - case K_F7: - case K_F8: - case K_ENTER: - { - strcpy (dep.SysName,_mask->get (FLD_NOME)); - dep.EOD = atol(_mask->get (FLD_EOD)); - dep.Flags = atol(_mask->get (FLD_FLAG)); - strcpy (dep.Des,_mask->get (FLD_DESC)); - strcpy (dep.FCalc,_mask->get (FLD_FORMULA)); - const TRecnotype eox = atol(_mask->get(FLD_EOX)); + if (logicnum > 1) + { + TEdit_file ef; + ef.browse(logicnum, filename); + } + } + break; + case K_F5: + case K_F6: + case K_F7: + case K_F8: + case K_ENTER: + { + strcpy (dep.SysName,_mask->get (FLD_NOME)); + dep.EOD = atol(_mask->get (FLD_EOD)); + dep.Flags = atol(_mask->get (FLD_FLAG)); + strcpy (dep.Des,_mask->get (FLD_DESC)); + strcpy (dep.FCalc,_mask->get (FLD_FORMULA)); + const TRecnotype eox = atol(_mask->get(FLD_EOX)); - _browse->dir()->get(logicnum, _lock, _nordir, _sysdirop); - _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, - dep.Des, dep.FCalc); - _browse->dir()->put(logicnum, _nordir, _sysdirop); + _browse->dir()->get(logicnum, _lock, _nordir, _sysdirop); + _browse->dir()->set(dep.SysName, dep.EOD, dep.Flags, + dep.Des, dep.FCalc); + _browse->dir()->put(logicnum, _nordir, _sysdirop); - { - TSystemisamfile f(logicnum); + { + TSystemisamfile f(logicnum); - if (eox != oldeox) - { - d.get(logicnum); - if (!fexist(d.name())) f.build(eox); - else f.extend(eox); - _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); - } - if (tasto == K_F5) - { - f.packfile(); - f.packindex(); - } - else - if (tasto == K_F6) - { - TRec_sheet r(logicnum); + if (eox != oldeox) + { + d.get(logicnum); + if (!fexist(d.name())) f.build(eox); + else f.extend(eox); + _browse->dir()->get(logicnum, _nolock, _nordir, _sysdirop); + } + if (tasto == K_F5) + { + f.packfile(); + f.packindex(); + } + else + if (tasto == K_F6) + { + enable_menu_item(M_FILE_PRINT); + _rec = new TRec_sheet(logicnum); + _rec->edit(); + delete _rec; + _rec = NULL; + disable_menu_item(M_FILE_PRINT); + } + else + if (tasto == K_F7) + { + TMask m("ba1100b"); + TFilename nout(dep.SysName); - r.edit(); - } - else - if (tasto == K_F7) - { - TMask m("ba1100b"); - TFilename nout(dep.SysName); + nout.strip("$%"); + nout.ext("txt"); + m.set(FLD_OUTFILE, nout); + if (m.run() == K_ENTER) + { + const char fs = *esc(m.get(FLD_FS)); + const char fd = *esc(m.get(FLD_FD)); + const char rs = *esc(m.get(FLD_RS)); + const bool withdel = m.get(FLD_WITHDEL).not_empty(); - nout.strip("$%"); - nout.ext("txt"); - m.set(FLD_OUTFILE, nout); - if (m.run() == K_ENTER) - { - const char fs = *esc(m.get(FLD_FS)); - const char fd = *esc(m.get(FLD_FD)); - const char rs = *esc(m.get(FLD_RS)); - const bool withdel = m.get(FLD_WITHDEL).not_empty(); + f.dump(m.get(FLD_OUTFILE), atoi(m.get(FLD_KEYNO)), fs, fd, rs, withdel); + } + } + else + if (tasto == K_F8) + { + TMask m("ba1100c"); + TFilename ninp(dep.SysName); - f.dump(m.get(FLD_OUTFILE), atoi(m.get(FLD_KEYNO)), fs, fd, rs, withdel); - } - } - else - if (tasto == K_F8) - { - TMask m("ba1100c"); - TFilename ninp(dep.SysName); + ninp.strip("$%"); + ninp.ext("txt"); + m.set(FLD_INFILE, ninp); + if (m.run() == K_ENTER) + { + char fs = *esc(m.get(FLD_FS)); + char fd = *esc(m.get(FLD_FD)); + char rs = *esc(m.get(FLD_RS)); - ninp.strip("$%"); - ninp.ext("txt"); - m.set(FLD_INFILE, ninp); - if (m.run() == K_ENTER) - { - char fs = *esc(m.get(FLD_FS)); - char fd = *esc(m.get(FLD_FD)); - char rs = *esc(m.get(FLD_RS)); - - f.load(m.get(FLD_INFILE), fs, fd, rs); - } - } - } - } - break; - default: - break; - } + f.load(m.get(FLD_INFILE), fs, fd, rs); + } + } + } + } + break; + default: + break; + } } void BA1100_application::delete_riga () { - _browse->dir()->get(LF_DIR); - if (_browse->dir()->eod() == 0) return; + _browse->dir()->get(LF_DIR); + if (_browse->dir()->eod() == 0) return; - int logicnum = (int)_browse->items(); + int logicnum = (int)_browse->items(); - _browse->dir()->get(logicnum); - if (yesnocancel_box("Vuoi davvero eliminare l' archivio %s", _browse->dir()->name()) != K_YES) return; - _browse->dir()->get(LF_DIR); - _browse->dir()->eod()--; - _browse->set_items(_browse->dir()->eod()); - _browse->dir()->put(LF_DIR); + _browse->dir()->get(logicnum); + if (yesnocancel_box("Vuoi davvero eliminare l' archivio %s", _browse->dir()->name()) != K_YES) return; + _browse->dir()->get(LF_DIR); + _browse->dir()->eod()--; + _browse->set_items(_browse->dir()->eod()); + _browse->dir()->put(LF_DIR); } @@ -261,22 +329,22 @@ void BA1100_application::update_dir() for (int i = 2; i <= items; i++) { - prefhndl->set(""); - d.get(i, _nolock, _nordir, _sysdirop); - if (d.flags() == -1) - { - TString s(d.name()); - word len = d.len(); - prefhndl->set(pref); - d.get(i, _nolock, _nordir, _sysdirop); - if (len != d.len() && s != d.name()) - { - d.set(s, d.eox(), 0L, d.des(), d.expr()); - d.put(i, _nordir, _sysdirop); + prefhndl->set(""); + d.get(i, _nolock, _nordir, _sysdirop); + if (d.flags() == -1) + { + TString s(d.name()); + word len = d.len(); + prefhndl->set(pref); + d.get(i, _nolock, _nordir, _sysdirop); + if (len != d.len() && s != d.name()) + { + d.set(s, d.eox(), 0L, d.des(), d.expr()); + d.put(i, _nordir, _sysdirop); } } } - prefhndl->set(pref); + prefhndl->set(pref); if (items >= orig_items) return; @@ -319,7 +387,7 @@ void BA1100_application::convert_dir() void BA1100_application::update() { - long firm = get_firm(); + long firm = get_firm(); TString pref; if (firm == 0) pref = prefhndl->name(); @@ -337,13 +405,13 @@ void BA1100_application::update() for (ditte.first(); !ditte.eof(); ditte.next()) { - set_firm(ditte.get_long("CODDITTA")); - const TRecnotype rec = ditte.recno(); - ditte.close(); - update_dir(); + set_firm(ditte.get_long("CODDITTA")); + const TRecnotype rec = ditte.recno(); + ditte.close(); + update_dir(); convert_dir(); - ditte.open(); - ditte.readat(rec); + ditte.open(); + ditte.readat(rec); } if (firm > 0) set_firm(firm); else prefhndl->set(pref); @@ -352,57 +420,57 @@ void BA1100_application::update() bool BA1100_application::menu(MENU_TAG m) { -TToken_string riga; -long riga_selezionata; -bool done = FALSE; +TToken_string riga; +long riga_selezionata; +bool done = FALSE; _browse->rebuild(); while (!done) { - disable_menu_item(M_FILE_NEW); + disable_menu_item(M_FILE_NEW); - switch (_browse->run()) - { - case K_INS: - riga_selezionata = _browse->selected(); - riga = _browse->row(); - insert_riga (riga_selezionata, riga); - break; - - case K_ENTER: - riga_selezionata = _browse->selected(); - riga = _browse->row(); - edit_riga (riga_selezionata, riga); - break; + switch (_browse->run()) + { + case K_INS: + riga_selezionata = _browse->selected(); + riga = _browse->row(); + insert_riga (riga_selezionata, riga); + break; + + case K_ENTER: + riga_selezionata = _browse->selected(); + riga = _browse->row(); + edit_riga (riga_selezionata, riga); + break; - case K_DEL: delete_riga(); break; + case K_DEL: delete_riga(); break; - case K_ESC: done = TRUE; break; + case K_ESC: done = TRUE; break; - case K_F7: update(); break; - - case K_F8: - _browse->add(); + case K_F7: update(); break; + + case K_F8: + _browse->add(); riga_selezionata = _browse->items() - 1; - riga = _browse->row(riga_selezionata); - edit_riga (riga_selezionata, riga); - break; + riga = _browse->row(riga_selezionata); + edit_riga (riga_selezionata, riga); + break; default: break; - } - - enable_menu_item(M_FILE_NEW); + } + + enable_menu_item(M_FILE_NEW); } return TRUE; } int ba1100(int argc, char* argv[], bool insmode) { - BA1100_application a; + BA1100_application a; - a.run(argc, argv, "Gestione files"); - return 0; + a.run(argc, argv, "Gestione files"); + return 0; } diff --git a/ba/ba1100.h b/ba/ba1100.h index f672b7ca5..581c26ac5 100755 --- a/ba/ba1100.h +++ b/ba/ba1100.h @@ -10,12 +10,12 @@ class TDir_sheet : public TSheet { - TTrec *_rec; - TDir *_dir; - FileDes _s_dir; - long _items; + TTrec *_rec; + TDir *_dir; + FileDes _s_dir; + long _items; -protected: set_firm(); +protected: set_firm(); void page_build(long first, byte rows); @@ -33,29 +33,24 @@ public: class TRec_sheet : public TObject { - TTrec *_rec; - TTrec *_rec_old; - TDir *_dir; - bool _comfile; - static TMask *_mask; + TTrec *_rec; + TTrec *_rec_old; + TDir *_dir; + bool _comfile; + static TMask *_mask; protected: - void update_keys(int from, int shift); - const char* build_key_expr(int key); - bool check_key_expr(int key, const char* key_expr); - void update_key_expr(int key, TToken_string& s); - const char* build_field(int nfld); - void update_field(int nfld, TToken_string& s); - static bool fld_notify(int r, KEY k); - static bool key_notify(int r, KEY k); - void save(); - virtual long items() const { return _rec->items(); } - TDir* dir() const { return _dir; } - TTrec* rec() const { return _rec; } + bool check_key_expr(int key, const char* key_expr); + static bool fld_notify(int r, KEY k); + static bool key_notify(int r, KEY k); + void save(); + virtual long items() const { return _rec->fields(); } public: TRec_sheet(int logicnum); ~TRec_sheet(); + TDir* dir() const { return _dir; } + TTrec* rec() const { return _rec; } void edit(); }; diff --git a/ba/ba1100d.uml b/ba/ba1100d.uml index a7b052a3f..9dfc84f95 100755 --- a/ba/ba1100d.uml +++ b/ba/ba1100d.uml @@ -1,179 +1,179 @@ -#include -#include "ba1100a.h" - -TOOLBAR "" 0 20 0 2 - -BUTTON DLG_SAVEREC 8 2 -BEGIN - PROMPT -16 -1 "" -END - -BUTTON DLG_PRINT 8 2 -BEGIN - PROMPT -26 -1 "Stampa" - MESSAGE K_F5 -END - -BUTTON DLG_EXPORT 8 2 -BEGIN - PROMPT -36 -1 "Esporta" - MESSAGE K_F6 -END - -BUTTON DLG_IMPORT 8 2 -BEGIN - PROMPT -46 -1 "Importa" - MESSAGE K_F7 -END - -BUTTON DLG_CANCEL 8 2 -BEGIN - PROMPT -56 -1 "" -END - -ENDPAGE - -PAGE "Modifica Tracciato Record - Campi" -1 -1 77 20 - -NUMBER F_NUM 4 -BEGIN - PROMPT 1 1 "Archivio n. " - FLAGS "D" -END - -STRING F_DES 50 -BEGIN - PROMPT 20 1 "" - FLAGS "D" -END - -SPREADSHEET F_FIELDS 0 7 -BEGIN - PROMPT 16 4 "" - ITEM "Nome@10" - ITEM "Tipo" - ITEM "Lunghezza" - ITEM "Decimali" -END - - -SPREADSHEET F_KEYS -BEGIN - PROMPT 1 13 "" - ITEM "Espressione@60" - ITEM "Chiavi duplicate" -END - -ENDPAGE - -ENDMASK - -PAGE "Campo" -1 -1 60 9 - -STRING F_NUMF 3 3 -BEGIN - PROMPT 2 1 "Numero " - FLAGS "DR" -END - -STRING F_NOMEF 10 -BEGIN - PROMPT 2 2 "Nome " - FLAGS "U" - HELP "Inserire il nome" -END - -LIST FLD_TIPO 20 -BEGIN - PROMPT 2 3 "Tipo " - HELP "Inserire il tipo" - ITEM "1|Alfanumerico" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "2|Intero" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "3|Intero Lungo" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "4|Reale" - MESSAGE ENABLE,FLD_LEN|ENABLE,FLD_DEC - ITEM "5|Data" - MESSAGE DISABLE,FLD_LEN|"6",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "6|Intero" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "7|Carattere" - MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "8|Booleano" - MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "9|Intero Zerofilled" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC - ITEM "10|Intero Lungo Zerofilled" - MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC -END - -NUMBER FLD_LEN 3 -BEGIN - PROMPT 2 4 "Lunghezza " - FLAGS "R" - HELP "Inserire la lunghezza" - WARNING "Numero lunghezza campo errata" -END - -NUMBER FLD_DEC 2 -BEGIN - PROMPT 2 5 "Decimali " - FLAGS "R" - HELP "Inserire i decimali" - NUM_EXPR {(#THIS_FIELD>=0) && (#THIS_FIELD+2<=#FLD_LEN)} - WARNING "Numero di decimali errato" -END - -BUTTON DLG_OK 8 2 -BEGIN - PROMPT -13 -1 "" -END - -BUTTON DLG_CANCEL 8 2 -BEGIN - PROMPT -23 -1 "" -END - -BUTTON DLG_DELREC 8 2 -BEGIN - PROMPT -33 -1 "Elimina" -END - -ENDPAGE - -ENDMASK - -PAGE "Chiave" -1 -1 77 9 - -STRING F_KEXPR 60 -BEGIN - PROMPT 1 2 "Espressione " - FLAGS "U" -END - -BOOLEAN F_KDUP -BEGIN - PROMPT 1 4 "Chiavi duplicate" - FLAGS "D" -END - -BUTTON DLG_OK 8 2 -BEGIN - PROMPT -13 -1 "" -END - -BUTTON DLG_CANCEL 8 2 -BEGIN - PROMPT -23 -1 "" -END - -BUTTON DLG_DELREC 8 2 -BEGIN - PROMPT -33 -1 "Elimina" -END - -ENDPAGE -ENDMASK - +#include +#include "ba1100a.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_SAVEREC 8 2 +BEGIN + PROMPT -16 -1 "" +END + +BUTTON DLG_PRINT 8 2 +BEGIN + PROMPT -26 -1 "Stampa" + MESSAGE EXIT,K_F5 +END + +BUTTON DLG_EXPORT 8 2 +BEGIN + PROMPT -36 -1 "Esporta" + MESSAGE EXIT,K_F6 +END + +BUTTON DLG_IMPORT 8 2 +BEGIN + PROMPT -46 -1 "Importa" + MESSAGE EXIT,K_F7 +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -56 -1 "" +END + +ENDPAGE + +PAGE "Modifica Tracciato Record - Campi" -1 -1 77 20 + +NUMBER F_NUM 4 +BEGIN + PROMPT 1 1 "Archivio n. " + FLAGS "D" +END + +STRING F_DES 50 +BEGIN + PROMPT 20 1 "" + FLAGS "D" +END + +SPREADSHEET F_FIELDS 34 7 +BEGIN + PROMPT 15 4 "" + ITEM "Nome@10" + ITEM "Tipo" + ITEM "Lunghezza" + ITEM "Decimali" +END + + +SPREADSHEET F_KEYS +BEGIN + PROMPT 1 13 "" + ITEM "Espressione@60" + ITEM "Chiavi duplicate" +END + +ENDPAGE + +ENDMASK + +PAGE "Campo" -1 -1 60 9 + +STRING F_NUMF 3 3 +BEGIN + PROMPT 2 1 "Numero " + FLAGS "DR" +END + +STRING F_NOMEF 10 +BEGIN + PROMPT 2 2 "Nome " + FLAGS "U" + HELP "Inserire il nome" +END + +LIST FLD_TIPO 20 +BEGIN + PROMPT 2 3 "Tipo " + HELP "Inserire il tipo" + ITEM "1|Alfanumerico" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "2|Intero" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "3|Intero Lungo" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "4|Reale" + MESSAGE ENABLE,FLD_LEN|ENABLE,FLD_DEC + ITEM "5|Data" + MESSAGE DISABLE,FLD_LEN|"6",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "6|Intero" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "7|Carattere" + MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "8|Booleano" + MESSAGE DISABLE,FLD_LEN|"1",FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "9|Intero Zerofilled" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC + ITEM "10|Intero Lungo Zerofilled" + MESSAGE ENABLE,FLD_LEN|DISABLE,FLD_DEC|"0",FLD_DEC +END + +NUMBER FLD_LEN 3 +BEGIN + PROMPT 2 4 "Lunghezza " + FLAGS "R" + HELP "Inserire la lunghezza" + WARNING "Numero lunghezza campo errata" +END + +NUMBER FLD_DEC 2 +BEGIN + PROMPT 2 5 "Decimali " + FLAGS "R" + HELP "Inserire i decimali" + NUM_EXPR {(#THIS_FIELD>=0) && (#THIS_FIELD+2<=#FLD_LEN)} + WARNING "Numero di decimali errato" +END + +BUTTON DLG_OK 8 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_DELREC 8 2 +BEGIN + PROMPT -33 -1 "Elimina" +END + +ENDPAGE + +ENDMASK + +PAGE "Chiave" -1 -1 77 9 + +STRING F_KEXPR 60 +BEGIN + PROMPT 1 2 "Espressione " + FLAGS "U" +END + +BOOLEAN F_KDUP +BEGIN + PROMPT 1 4 "Chiavi duplicate" + FLAGS "D" +END + +BUTTON DLG_OK 8 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_CANCEL 8 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_DELREC 8 2 +BEGIN + PROMPT -33 -1 "Elimina" +END + +ENDPAGE +ENDMASK + diff --git a/ba/ba1100f.uml b/ba/ba1100f.uml new file mode 100755 index 000000000..7465c8eac --- /dev/null +++ b/ba/ba1100f.uml @@ -0,0 +1,25 @@ +#include +#include "ba1100a.h" + +PAGE "Esportazione/Importazione tracciati" -1 -1 75 5 + +STRING F_NOMEF 50 +BEGIN + PROMPT 2 1 "File " + FLAGS "" + HELP "Inserire il nome del file di esportazione/importazione" + CHECKTYPE REQUIRED +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/ba/ba1101.cpp b/ba/ba1101.cpp index 8a7f32310..535a38a59 100755 --- a/ba/ba1101.cpp +++ b/ba/ba1101.cpp @@ -1,7 +1,9 @@ // Includo stdio senno' dice che ridefinisco FILE #include +#include +#include #include #include #include @@ -13,10 +15,9 @@ #include #include "ba1100.h" -#define INVFLD 255 -TMask* TRec_sheet::_mask = NULL; -HIDDEN TToken_string s(256); +TMask* TRec_sheet::_mask = NULL; +HIDDEN TToken_string s(256); void TDir_sheet::add () @@ -35,7 +36,7 @@ void TDir_sheet::add () } TDir_sheet::TDir_sheet(const char* title) - : TSheet(-1,-1, 0, 0, title,"N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Formula@33|Flags@7", 0xC) + : TSheet(-1,-1, 0, 0, title,"N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Formula@33|Flags@7", 0xC) { _dir = new TDir; _rec = new TTrec; @@ -51,279 +52,217 @@ TDir_sheet::~TDir_sheet() void TDir_sheet::page_build(long first, byte rows) { - TToken_string l(128); + TToken_string l(128); - for (byte i = 0; i < rows; i++) - { - const int n = int(i+first+1); - _dir->get (n,_nolock,_nordir,_sysdirop); + for (byte i = 0; i < rows; i++) + { + const int n = int(i+first+1); + _dir->get (n,_nolock,_nordir,_sysdirop); - l = format("%3d", n); // Numero progressivo del file - l.add(_dir->name()); - const TRecnotype eod = _dir->eod(); - l.add(format("%ld", eod)); - const TRecnotype eox = _dir->eox(); - l.add(format("%ld", eox)); - const word len = _dir->len(); - l.add(format("%u", len)); - l.add(_dir->des()); - l.add(_dir->expr()); - l.add(format("%ld", _dir->flags())); - set_row(l, i); - } + l = format("%3d", n); // Numero progressivo del file + l.add(_dir->name()); + const TRecnotype eod = _dir->eod(); + l.add(format("%ld", eod)); + const TRecnotype eox = _dir->eox(); + l.add(format("%ld", eox)); + const word len = _dir->len(); + l.add(format("%u", len)); + l.add(_dir->des()); + l.add(_dir->expr()); + l.add(format("%ld", _dir->flags())); + set_row(l, i); + } } TRec_sheet::TRec_sheet(int logicnum) { - _dir = new TDir; - _rec = new TTrec; - _rec_old = new TTrec; - _mask = new TMask("ba1100d"); + _dir = new TDir; + _rec = new TTrec; + _rec_old = new TTrec; + _mask = new TMask("ba1100d"); - _dir->get(logicnum, _lock, _nordir, _sysdirop); - _rec->get(logicnum); - *_rec_old = *_rec; + _dir->get(logicnum, _lock, _nordir, _sysdirop); + _rec->get(logicnum); + *_rec_old = *_rec; } TRec_sheet::~TRec_sheet() { - delete _dir; - delete _rec; - delete _rec_old; - delete _mask; - _mask = NULL; -} - - - -void TRec_sheet::update_keys(int from, int shift) - -{ - RecDes *rdes = _rec->rec(); - - for (int i = 0 ; i < rdes->NKeys; i++) - for (int j = 0 ; j < rdes->Ky[i].NkFields; j++) - { - const int nfld = rdes->Ky[i].FieldSeq[j] - (rdes->Ky[i].FieldSeq[j] > MaxFields ? MaxFields : 0); - - if (nfld > from) rdes->Ky[i].FieldSeq[j] += shift; - else - if (nfld == from) - { - if (shift < 0) - { - rdes->Ky[i].NkFields--; - for (int k = rdes->Ky[i].NkFields; k > j; k--) - rdes->Ky[i].FieldSeq[j] = rdes->Ky[i].FieldSeq[j + 1]; - } - else - if (nfld >= from) rdes->Ky[i].FieldSeq[j] += shift; - } - } -} - -const char* TRec_sheet::build_key_expr(int key) - -{ - RecDes *rdes = _rec->rec(); - - s = ""; - for (int j = 0 ; j < rdes->Ky[key].NkFields; j++) - { - const bool upper = rdes->Ky[key].FieldSeq[j] > MaxFields; - const int nfld = rdes->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0); - if (j) s << "+"; - if (upper) s << "UPPER("; - s << rdes->Fd[nfld].Name; - if (rdes->Ky[key].FromCh[j] < INVFLD) - s << format("[%d,%d]", rdes->Ky[key].FromCh[j] + 1, - rdes->Ky[key].ToCh[j] + 1); - else - if (upper) s << ")"; - } - s.add(rdes->Ky[key].DupKeys ? "X" : " "); - return (const char*) s; + delete _dir; + delete _rec; + delete _rec_old; + delete _mask; + _mask = NULL; } bool TRec_sheet::check_key_expr(int key, const char * key_expr) { - TExpression expr("", _strexpr); - return expr.set(key_expr, _strexpr); -} - -void TRec_sheet::update_key_expr(int key, TToken_string& s) - -{ - RecDes *rdes = _rec->rec(); - - TExpression expr("", _strexpr); - TString ke(s.get()); - - if (expr.set((const char*) ke, _strexpr)) - { - rdes->Ky[key].DupKeys = (*s.get() != ' '); - TCodearray& c = expr.code(); - c.begin(); - int n = 0; - while (!c.end()) - { - TCode& inst = c.step(); - TCodesym sym = inst.getsym(); - - if (sym == _variable) - { - const char* s = inst.string(); - - for (int i = 0; i NFields; i++) - if (strcmp(rdes->Fd[i].Name, s) == 0) break; - - rdes->Ky[key].FieldSeq[n] = i; - rdes->Ky[key].FromCh[n] = INVFLD; - rdes->Ky[key].FromCh[n] = INVFLD; - inst = c.step(); - sym = inst.getsym(); - if (sym == _upper) - rdes->Ky[key].FieldSeq[n] += MaxFields; - else - if (sym == _number) - { - rdes->Ky[key].FromCh[n] = inst.number().integer() - 1; - inst = c.step(); - rdes->Ky[key].ToCh[n] = inst.number().integer() - 1; - inst = c.step(); - } - else c.backtrace(); - n++; - } - } - rdes->Ky[key].NkFields = n; - } -} - -const char* TRec_sheet::build_field(int nfld) - -{ - RecDes *rdes = _rec->rec(); - - // s.format("%d", nfld+1); - s = ""; - s.add((const char*)rdes->Fd[nfld].Name); - s.add(format("%d", rdes->Fd[nfld].TypeF)); - s.add(format("%d", rdes->Fd[nfld].Len)); - s.add(format("%d", rdes->Fd[nfld].Dec)); - return (const char*) s; -} - -void TRec_sheet::update_field(int nfld, TToken_string& s) - -{ - RecDes *rdes = _rec->rec(); - - // s.get(); - strcpy(rdes->Fd[nfld].Name, s.get()); - rdes->Fd[nfld].TypeF = atoi(s.get()); - rdes->Fd[nfld].Len = atoi(s.get()); - rdes->Fd[nfld].Dec = atoi(s.get()); + TExpression expr("", _strexpr); + return expr.set(key_expr, _strexpr); } HIDDEN bool len_handler(TMask_field& f, KEY key) { - const int len = atoi(f.get()); + const int len = atoi(f.get()); - if (len < 0) return FALSE; + if (len < 0) return FALSE; - const int typef = atoi(f.mask().get(FLD_TIPO)); + const int typef = atoi(f.mask().get(FLD_TIPO)); - switch (typef) - { - case _alfafld: return len <= INVFLD; - case _intfld: return len <= 5; - case _longfld: return len <= 10; - case _realfld: return len <= 18; - case _wordfld: return len <= 5; - case _intzerofld: return len <= 5; - case _longzerofld: return len <= 10; - default: return TRUE; - } - return TRUE; + switch (typef) + { + case _alfafld: return len <= 254; + case _intfld: return len <= 5; + case _longfld: return len <= 10; + case _realfld: return len <= 18; + case _wordfld: return len <= 5; + case _intzerofld: return len <= 5; + case _longzerofld: return len <= 10; + default: return TRUE; + } + return TRUE; } bool TRec_sheet::fld_notify(int r, KEY k) { - const TSheet_field& f = (const TSheet_field&) _mask->field(F_FIELDS); + const TSheet_field& f = (const TSheet_field&) _mask->field(F_FIELDS); - if (k == K_SPACE) - { - TMask& m = f.sheet_mask(); + if (k == K_SPACE) + { + TMask& m = f.sheet_mask(); - m.set(F_NUMF, r + 1); - } - return TRUE; + m.set(F_NUMF, r + 1); + } + return TRUE; } bool TRec_sheet::key_notify(int r, KEY k) { - const TSheet_field& f = (const TSheet_field&) _mask->field(F_KEYS); + const TSheet_field& f = (const TSheet_field&) _mask->field(F_KEYS); - if (k == K_SPACE) - { - TMask& m = f.sheet_mask(); + if (k == K_SPACE) + { + TMask& m = f.sheet_mask(); - m.enable(F_KDUP, r > 0); - if (r == 0) m.reset(F_KDUP); - } - else - if (k == K_INS && f.items() >= 8) return FALSE; - return TRUE; + m.enable(F_KDUP, r > 0); + if (r == 0) m.reset(F_KDUP); + } + else + if (k == K_INS && f.items() >= 8) return FALSE; + return TRUE; } void TRec_sheet::save() { - if (*_rec == *_rec_old || - !yesnocancel_box("Devo salvare le modifiche")) return; - TSystemisamfile f(_rec->num()); + if (*_rec == *_rec_old || + !yesnocancel_box("Devo salvare le modifiche")) return; + TSystemisamfile f(_rec->num()); - f.update(*_rec); - *_rec_old = *_rec; + f.update(*_rec); + *_rec_old = *_rec; } void TRec_sheet::edit() { - TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS); - TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS); - RecDes *rdes = _rec->rec(); + TSheet_field& f1 = (TSheet_field&) _mask->field(F_FIELDS); + TSheet_field& f2 = (TSheet_field&) _mask->field(F_KEYS); + + _mask->set (F_NUM, _dir->num()); + _mask->set (F_DES, _dir->des()); + f1.set_notify(fld_notify); + f1.sheet_mask().field(FLD_LEN).set_handler(len_handler); + int nfields = _rec->fields(); + for (int i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i); + f2.set_notify(key_notify); + int nkeys = _rec->keys(); + for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i); + while (TRUE) + { + switch (_mask->run()) + { + case K_SAVE: + { + nfields = f1.items(); + _rec->set_fields(nfields); + for (i = 0; i < nfields; i++) + { + TToken_string& s = f1.row(i); + _rec->update_fielddef(i, s); + } + _rec->rehash(); + nkeys = f2.items(); + _rec->set_keys(nkeys); + for (i = 0; i < nkeys; i++) + { + TToken_string& s = f2.row(i); + _rec->update_keydef(i, s); + } + save(); + } + case K_ESC: + return; + case K_F5: + MainApp()->dispatch_e_menu(M_FILE_PRINT); + break; + case K_F6: + { + TMask m("ba1100f"); + TFilename nout(_dir->name()); - _mask->set (F_NUM, _dir->num()); - _mask->set (F_DES, _dir->des()); - f1.set_notify(fld_notify); - f1.sheet_mask().field(FLD_LEN).set_handler(len_handler); - for (int i = 0; i < rdes->NFields; i++) f1.row(i) = build_field(i); - f2.set_notify(key_notify); - for (i = 0; i < rdes->NKeys; i++) f2.row(i) = build_key_expr(i); - if (_mask->run() == K_SAVE) - { - rdes->NFields = f1.items(); - for (i = 0; i < rdes->NFields; i++) - { - TToken_string& s = f1.row(i); - update_field(i, s); - } - _rec->rehash(); - rdes->NKeys = f2.items(); - for (i = 0; i < rdes->NKeys; i++) - { - TToken_string& s = f2.row(i); - update_key_expr(i, s); - } - save(); - } + nout.strip("$%"); + nout.ext("trr"); + m.set(F_NOMEF, nout); + if (m.run() == K_ENTER) + { + TString80 nf(m.get(F_NOMEF)); + + if (nf.not_empty()) + { + ofstream out((const char*) nf); + + out << *_rec; + } + } + } + break; + case K_F7: + { + TMask m("ba1100f"); + TFilename nout(_dir->name()); + + nout.strip("$%"); + nout.ext("trr"); + m.set(F_NOMEF, nout); + if (m.run() == K_ENTER) + { + TString80 nf(m.get(F_NOMEF)); + + if (nf.not_empty()) + { + ifstream in((const char*) nf); + + in >> *_rec; + nfields = _rec->fields(); + f1.reset(); + for (i = 0; i < nfields; i++) f1.row(i) = _rec->fielddef(i); + nkeys = _rec->keys(); + f2.reset(); + for (i = 0; i < nkeys; i++) f2.row(i) = _rec->keydef(i); + } + } + } + break; + default: break; + } + } } + diff --git a/ba/ba1102.cpp b/ba/ba1102.cpp index 5cb2ba1ba..3cb500053 100755 --- a/ba/ba1102.cpp +++ b/ba/ba1102.cpp @@ -1,72 +1,200 @@ -// Includo stdio senno' dice che ridefinisco FILE -#include - -#ifndef __FILES_H -#include -#endif - -#ifndef __MASK_H -#include -#endif - -#ifndef __SHEET_H -#include -#endif - -#ifndef __URLDEFID_H -#include -#endif - -#ifndef __VALIDAT_H -#include -#endif - -#ifndef __BA1201_H -#include "ba1201.h" -#endif - - -TRec_sheet::TRec_sheet(int logicnum) - : TSheet(-1,-1, 0, 0, "","N.|Nome|Lung.|Dec.|Offset", 0x6) -{ -_dir = new TDir; -_rec = new TTrec; - -_dir->get(logicnum, _nordir, _lock, _nordir); -_rec->get(logicnum, _comfile ? _condir : _nordir); - -TRec_sheet::~TRec_sheet() -{ -delete _dir; -delete _rec; -} - - -void TRec_sheet::page_build(long first, byte rows) -{ - TToken_string l; - TString dep(256); - RecDes *rdes; - -_rec->get(1, _nordir); - - - for (byte i = 0; i < rows; i++) - { - dep << (int)i+1+first; // Numero progressivo del file - l = dep.right_just(3); - dep = ""; - rdes = _rec->rec(); - l.add((const char*)rdes->Fd[i].Name); - l.add((const char*)rdes->Fd[i].TypeF); - dep << rdes->Fd[i].Name; - l.add ( (const char*) dep); - dep = ""; - dep << rdes->Fd[i].Dec; - l.add( (const char*) dep); - - set_row(l, i); - } -} - - +#include +#include +#include +#include +#include + +#include "ba1100.h" + + + +bool TEdit_file::browse(int logicnum, const char* name) +{ + TRelation relation(logicnum); + TCursor cursor(&relation); + TRectype& curr = cursor.curr(); + TRectype svrec(cursor.curr()); + + TToken_string head(256); + TToken_string trac(256); + + const char* n; + trac.add(""); + head.add("@1"); + + for(int i = 0; (n = curr.fieldname(i)) != NULL; i++) + { + trac.add(n); + head.add(n); + + int len = curr.length(n); + if (curr.type(n) == _datefld) len = 10; + if (len > strlen(n)) head << '@' << len; + } + + KEY ch; + TCursor_sheet sheet(&cursor, trac, name, head, 6); + + while ((ch = sheet.run()) != K_ESC) + { + if (ch == K_DEL && sheet.one_checked()) + { + TProgind* pind = NULL; + cursor.freeze(TRUE); + bool go = FALSE; + bool first = FALSE; + int j; + for (j = 0, cursor = 0; j < sheet.items(); ++cursor, j++) + { + if (sheet.checked(j)) + { + if (!go && !first) + go = yesno_box("Confermi la cancellazione dei %d " + "record indicati?", sheet.checked()); + first = TRUE; + + if (!pind) + { + pind = new TProgind(sheet.checked(),"Attendere...", + TRUE, TRUE, 32); + pind->addstatus(1); + } + else + { + if (pind->iscancelled()) break; + pind->addstatus(1); + } + + if (go) cursor.file()->remove(); + sheet.uncheck(j); + } + } + if (pind) delete pind; + cursor.freeze(FALSE); + + if (first) {sheet.select(1); continue;} + } + if (ch == K_ENTER || ch == K_DEL) + cursor = sheet.selected(); + + switch(ch) + { + case K_ENTER: // edit fields + svrec = curr; + if (edit_record(curr, FALSE) == K_ENTER) + { + TString s(svrec.key(1)); + + if (s != curr.key(1)) + { + cursor.file()->write(); + if (cursor.file()->good()) + { + curr = svrec; + cursor.file()->remove(); + } + } + else + cursor.file()->rewrite(); + } + break; + case K_DEL: // delete record + if (yesno_box("Confermare la cancellazione del record")) + cursor.file()->remove(); + break; + case K_INS: // insert new record + curr.zero(); + if (edit_record(curr,FALSE) == K_ENTER) + cursor.file()->write(); + break; + } + sheet.force_update(); + } + return K_ESC; +} + +KEY TEdit_file::edit_record(TRectype& rec, bool readonly) +{ + for(int recs = 0; rec.fieldname(recs) != NULL; recs++); + + int rows = recs > 15 ? 20 : recs+4; + int pages = recs/15 + (recs % 15 ? 1 : 0); + TMask m("Modifica record", pages, 78, rows); + + int curpage = 0, currow = 1, nid = 100; + const char* cp; + + for(int i = 0; (cp = rec.fieldname(i)) != NULL; i++) + { + // add fields ONE by ONE + TString s(cp); s.left_just(16); + int len = rec.length(cp); + switch (rec.type(cp)) + { + case _alfafld: + m.add_string(nid++,curpage, s, 3, currow, len, "", + len > 50 ? 50 : len); + break; + case _intfld: + case _longfld: + case _wordfld: + case _realfld: + m.add_number(nid++, curpage, s, 3, currow, len, "", + rec.ndec(cp)); + break; + case _datefld: + m.add_date(nid++, curpage, s, 3, currow); + break; + case _charfld: + case _boolfld: + m.add_string(nid++,curpage, s, 3, currow, 1); + break; + case _intzerofld: + case _longzerofld: + m.add_number(nid++, curpage, s, 3, currow, len, "Z", + rec.ndec(cp)); + break; + default: + break; + } + + m.field(nid-1).set(rec.get(cp)); + + if (((i+1) % 15) == 0 || i == recs-1) + { + m.add_button(DLG_OK, curpage, "", -14, -1, 9, 3); + m.add_button(DLG_CANCEL, curpage, "", -24, -1, 9, 3); + if (curpage > 0) + m.add_button(DLG_PGUP, curpage, "", -34, -1, 9, 3); + if (pages > 1 && curpage < pages-1) + m.add_button(DLG_PGDN, curpage, "", -44, -1, 9, 3); + curpage++; currow = 1; + } + else currow++; + } + + if (readonly) + { + const int max = m.fields(); + for (int i = 0; i < max; i++) + { + TMask_field& f = m.fld(i); + if (f.class_id() != CLASS_BUTTON_FIELD) + f.disable(); + } + } + + const KEY k = m.run(); + + if (k == K_ENTER && !readonly) + { + nid = 100; + for(i = 0; (cp = rec.fieldname(i)) != NULL; i++) + rec.put(cp, m.get(nid++)); + } + + return k; +} + + + diff --git a/include/files.cpp b/include/files.cpp index 0ad68609e..697033024 100755 --- a/include/files.cpp +++ b/include/files.cpp @@ -1,319 +1,474 @@ -#include -#include -#include - -#include -#ifndef __EXTCDECL_H -#include -#endif - - -#define BLOCKLEN 512 - -TFile::TFile(int lenrec, int base) - -{ - _file = new SecDef; - if (_file == NULL) fatal_box("Can't allocate record file "); - _file->IOR = NOERR; - _len = lenrec; - _base = base; - _file->LockMode = _manulock; - _file->lpos = -1; - _file->name[0] = '\0'; -} - - -TFile::~TFile() - -{ - delete _file; -} - - -void TFile::open(const char* name, TFilelock lockmode) - -{ - COpen(_file, (char*) name, _len, _base, lockmode); -} - - -bool TFile::verify(const char* name) - -{ - CVerify(_file, (char*) name); - return _file->IOR == NOERR; -} - - -void TFile::create(const char* name, TRecnotype nrecord) - -{ - CCreate(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); -} - - -void TFile::chsize(const char* name, TRecnotype nrecord) - -{ - CChsize(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); -} - - -void TFile::close() - -{ - CClose(_file); -} - - -void TFile::unlink(const char* name) - -{ - CDelete(_file, (char*) name); -} - - -void TFile::read(char* record, TRecnotype recnum, TReclock lock) - -{ - _file->LenRec = _len; - _file->BaseFil = _base; - CRead(_file, record, recnum, lock); -} - - -void TFile::write(char* record, TRecnotype recnum, TReclock lock) - -{ - _file->LenRec = _len; - _file->BaseFil = _base; - CWrite(_file, record, recnum, lock); -} - - -int TFile::status() const - -{ - return _file->IOR; -} - - -TDir::TDir() - -{ - _dir = new FileDes; - if (_dir == NULL) - fatal_box("Can't allocate dir"); - zero(); - _num = - 1; -} - - -TDir::~TDir() - -{ - delete _dir; -} - - -const char* TDir::name() const - -{ - return _dir->SysName; -} - - -const char* TDir::des() const - -{ - return _dir->Des; -} - - -const char* TDir::expr() const - -{ - return _dir->FCalc; -} - - -TRecnotype& TDir::eod() const - -{ - return _dir->EOD; -} - - -TRecnotype& TDir::eox() const - -{ - return _dir->EOX; -} - - -TRecnotype& TDir::flags() const - -{ - return _dir->Flags; -} - - -word& TDir::len() - -{ - return (word&) _dir->LenR; -} - - -int TDir::status(TDirtype dirop) const - -{ - return fdir[dirop].IOR; -} - - -void TDir::set_len(const UINT16 len) -{ - _dir->LenR = len; -} - -void TDir::set_eox(const RecNoType eox) -{ - _dir->EOX = eox; -} - -void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc) -{ - strncpy (_dir->SysName, name, sizeof(_dir->SysName)); - _dir->EOD = eod; - _dir->Flags = flag; - strncpy (_dir->Des, des, sizeof(_dir->Des)); - strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc)); -} - -void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op) - -{ - int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); - - if (op == _nordirop) - COpenFile(nfile, _dir, int(lock), _whichdir); - else - CGetFile(nfile, _dir, int(lock), _whichdir); - _num = nfile; -} - - -void TDir::put(int nfile, TDirtype dirtype, TDirop op) - -{ - int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); - - if (nfile <= 0) - fatal_box("Bad file number %d", nfile); - if (op == _nordirop) - CCloseFile(nfile, _dir, _whichdir); - else - CPutFile(nfile, _dir, _whichdir); -} - - -void TDir::zero() - -{ - zerofdes(_dir); -} - - -int TDir::items(TDirtype dirtype) const - -{ - FileDes f; - int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); - - CGetFile(1, &f, _nolock, _whichdir); - return (int)f.EOD; -} - -TTrec::TTrec() - -{ - _rec = new RecDes; - if (_rec == NULL) - fatal_box("Can't allocate record description"); - zero(); - _num = - 1; -} - - -TTrec::~TTrec() - -{ - delete _rec; -} - - -int TTrec::compare(const TSortable& a) const - -{ - const TTrec& r = (const TTrec&)a; - const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec)); - return res; -} - -void TTrec::rehash() - -{ - setrdes(_rec); -} - -TTrec& TTrec::operator =(const TTrec& b) - -{ - _num = b._num; - memcpy(_rec, b._rec, sizeof(*_rec)); - return *this; -} - -void TTrec::get(int nfile, TDirtype dirtype) - -{ - int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); - - CGetRec(nfile, _rec, _whichdir); - _num = nfile; -} - - -void TTrec::put(int nfile, TDirtype dirtype) - -{ - int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); - - if (nfile <= 0) - fatal_box("Bad file number %d", nfile); - CPutRec(nfile, _rec, _whichdir); -} - - -void TTrec::zero() - -{ - zerordes(_rec); -} - - -int TTrec::status(TDirtype dirop) const - -{ - return rdir[dirop].IOR; -} - - -int TTrec::field(const char* name) const - - { - return findfld(_rec, (char*) name); - - } +#include +#include +#include +#include + +#include +#include +#ifndef __EXTCDECL_H +#include +#endif +#include + + +#define BLOCKLEN 512 +#define INVFLD 255 + +HIDDEN char _files_tmp_string[128]; + +TFile::TFile(int lenrec, int base) + +{ + _file = new SecDef; + if (_file == NULL) fatal_box("Can't allocate record file "); + _file->IOR = NOERR; + _len = lenrec; + _base = base; + _file->LockMode = _manulock; + _file->lpos = -1; + _file->name[0] = '\0'; +} + + +TFile::~TFile() + +{ + delete _file; +} + + +void TFile::open(const char* name, TFilelock lockmode) + +{ + COpen(_file, (char*) name, _len, _base, lockmode); +} + + +bool TFile::verify(const char* name) + +{ + CVerify(_file, (char*) name); + return _file->IOR == NOERR; +} + + +void TFile::create(const char* name, TRecnotype nrecord) + +{ + CCreate(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); +} + + +void TFile::chsize(const char* name, TRecnotype nrecord) + +{ + CChsize(_file, (char*) name, _len, _base, (nrecord * _len) /BLOCKLEN + 1); +} + + +void TFile::close() + +{ + CClose(_file); +} + + +void TFile::unlink(const char* name) + +{ + CDelete(_file, (char*) name); +} + + +void TFile::read(char* record, TRecnotype recnum, TReclock lock) + +{ + _file->LenRec = _len; + _file->BaseFil = _base; + CRead(_file, record, recnum, lock); +} + + +void TFile::write(char* record, TRecnotype recnum, TReclock lock) + +{ + _file->LenRec = _len; + _file->BaseFil = _base; + CWrite(_file, record, recnum, lock); +} + + +int TFile::status() const + +{ + return _file->IOR; +} + + +TDir::TDir() + +{ + _dir = new FileDes; + if (_dir == NULL) + fatal_box("Can't allocate dir"); + zero(); + _num = - 1; +} + + +TDir::~TDir() + +{ + delete _dir; +} + + +const char* TDir::name() const + +{ + return _dir->SysName; +} + + +const char* TDir::des() const + +{ + return _dir->Des; +} + + +const char* TDir::expr() const + +{ + return _dir->FCalc; +} + + +TRecnotype& TDir::eod() const + +{ + return _dir->EOD; +} + + +TRecnotype& TDir::eox() const + +{ + return _dir->EOX; +} + + +TRecnotype& TDir::flags() const + +{ + return _dir->Flags; +} + + +word& TDir::len() + +{ + return (word&) _dir->LenR; +} + + +int TDir::status(TDirtype dirop) const + +{ + return fdir[dirop].IOR; +} + + +void TDir::set_len(const UINT16 len) +{ + _dir->LenR = len; +} + +void TDir::set_eox(const RecNoType eox) +{ + _dir->EOX = eox; +} + +void TDir::set(const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc) +{ + strncpy (_dir->SysName, name, sizeof(_dir->SysName)); + _dir->EOD = eod; + _dir->Flags = flag; + strncpy (_dir->Des, des, sizeof(_dir->Des)); + strncpy (_dir->FCalc, calc, sizeof(_dir->FCalc)); +} + +void TDir::get(int nfile, TReclock lock, TDirtype dirtype, TDirop op) + +{ + int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); + + if (op == _nordirop) + COpenFile(nfile, _dir, int(lock), _whichdir); + else + CGetFile(nfile, _dir, int(lock), _whichdir); + _num = nfile; +} + + +void TDir::put(int nfile, TDirtype dirtype, TDirop op) + +{ + int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); + + if (nfile <= 0) + fatal_box("Bad file number %d", nfile); + if (op == _nordirop) + CCloseFile(nfile, _dir, _whichdir); + else + CPutFile(nfile, _dir, _whichdir); +} + + +void TDir::zero() + +{ + zerofdes(_dir); +} + + +int TDir::items(TDirtype dirtype) const + +{ + FileDes f; + int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); + + CGetFile(1, &f, _nolock, _whichdir); + return (int)f.EOD; +} + +TTrec::TTrec() + +{ + _rec = new RecDes; + if (_rec == NULL) + fatal_box("Can't allocate record description"); + zero(); + _num = - 1; +} + + +TTrec::~TTrec() + +{ + delete _rec; +} + + +int TTrec::compare(const TSortable& a) const + +{ + const TTrec& r = (const TTrec&)a; + const int res = memcmp((const void*)_rec, (const void*)r._rec, sizeof(*_rec)); + return res; +} + +void TTrec::rehash() + +{ + setrdes(_rec); +} + +TTrec& TTrec::operator =(const TTrec& b) + +{ + _num = b._num; + memcpy(_rec, b._rec, sizeof(*_rec)); + return *this; +} + +void TTrec::get(int nfile, TDirtype dirtype) + +{ + int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); + + CGetRec(nfile, _rec, _whichdir); + _num = nfile; +} + + +void TTrec::put(int nfile, TDirtype dirtype) + +{ + int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR); + + if (nfile <= 0) + fatal_box("Bad file number %d", nfile); + CPutRec(nfile, _rec, _whichdir); +} + + +void TTrec::zero() + +{ + zerordes(_rec); +} + + +int TTrec::status(TDirtype dirop) const + +{ + return rdir[dirop].IOR; +} + + +int TTrec::field(const char* name) const + + { + return findfld(_rec, (char*) name); + + } + +const char* TTrec::fielddef(int fld) const + +{ + sprintf(_files_tmp_string, "%s|%d|%d|%d", _rec->Fd[fld].Name, + (int) _rec->Fd[fld].TypeF, (int) _rec->Fd[fld].Len, + (int) _rec->Fd[fld].Dec); + return _files_tmp_string; +} + +const char* TTrec::keydef(int key) const + +{ + TFixed_string s(_files_tmp_string, 128); + + s = ""; + for (int j = 0 ; j < _rec->Ky[key].NkFields; j++) + { + const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields; + const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0); + + if (j) s << "+"; + if (upper) s << "UPPER("; + s << _rec->Fd[nfld].Name; + if (_rec->Ky[key].FromCh[j] < INVFLD) + s << format("[%d,%d]", _rec->Ky[key].FromCh[j] + 1, + _rec->Ky[key].ToCh[j] + 1); + if (upper) s << ")"; + } + s << (_rec->Ky[key].DupKeys ? "|X" : "| "); + return (const char*) s; +} + +void TTrec::update_fielddef(int nfld, const char* desc) + +{ + TToken_string s(desc); + strcpy(_rec->Fd[nfld].Name, s.get()); + _rec->Fd[nfld].TypeF = s.get_int(); + _rec->Fd[nfld].Len = s.get_int(); + _rec->Fd[nfld].Dec = s.get_int(); +} + + +void TTrec::update_keydef(int key, const char* desc) + +{ + TExpression expr("", _strexpr); + TToken_string s(desc); + TString ke(s.get()); + + if (expr.set((const char*) ke, _strexpr)) + { + _rec->Ky[key].DupKeys = (*s.get() != ' '); + TCodearray& c = expr.code(); + c.begin(); + int n = 0; + while (!c.end()) + { + TCode& inst = c.step(); + TCodesym sym = inst.getsym(); + + if (sym == _variable) + { + const char* s = inst.string(); + + for (int i = 0; i <_rec->NFields; i++) + if (strcmp(_rec->Fd[i].Name, s) == 0) break; + + _rec->Ky[key].FieldSeq[n] = i; + _rec->Ky[key].FromCh[n] = INVFLD; + _rec->Ky[key].FromCh[n] = INVFLD; + inst = c.step(); + sym = inst.getsym(); + if (sym == _upper) + _rec->Ky[key].FieldSeq[n] += MaxFields; + else + if (sym == _number) + { + _rec->Ky[key].FromCh[n] = inst.number().integer() - 1; + inst = c.step(); + _rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + inst.number().integer() - 1; + inst = c.step(); + } + else c.backtrace(); + n++; + } + } + _rec->Ky[key].NkFields = n; + } +} + +void TTrec::print_on(ostream& out) const + +{ + out << num() << '\n'; + const int nfields = fields(); + TToken_string s(80); + + out << nfields << '\n'; + for (int i = 0; i < nfields; i++) + { + s = fielddef(i); + out << s << '\n'; + } + const int nkeys = keys(); + + out << nkeys << '\n'; + for (i = 0; i < nkeys; i++) + { + s = keydef(i); + out << s << '\n'; + } +} + + +void TTrec::read_from(istream& in) + +{ + int ln; + + in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); + ln = atoi(_files_tmp_string); + if (ln != num() && !yesno_box("Descrizione relativa al file n.ro %d.\n Continuo ?", ln)) + return; + int nfields; + + in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); + nfields = atoi(_files_tmp_string); + set_fields(nfields); + for (int i = 0; i < nfields; i++) + { + in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); + update_fielddef(i, _files_tmp_string); + } + int nkeys; + + in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); + nkeys = atoi(_files_tmp_string); + set_keys(nkeys); + for (i = 0; i < nkeys; i++) + { + in.getline(_files_tmp_string, sizeof(_files_tmp_string), '\n'); + update_keydef(i, _files_tmp_string); + } + rehash(); +} + + diff --git a/include/files.h b/include/files.h index 9a8da40b1..d55a2ebca 100755 --- a/include/files.h +++ b/include/files.h @@ -1,121 +1,130 @@ -#ifndef __FILES_H -#define __FILES_H - -#ifndef __OBJECT_H -#include -#endif - -#ifndef __EXTCTYPE_H -#include -#endif - -#ifndef __RECTYPES_H -#include -#endif - -// @C -// Classe TFile : public TObject -// -// Il file. I suoi metodi comprendono tutte le procedure per l'accesso -// fisico di basso livello ai file. -// -// @END - -class TFile : public TObject -{ -// @DPRIV - SecDef* _file; - int _len; - int _base; -public: -// @FPUB - void open(const char* name, TFilelock lockmode = _manulock); - bool verify(const char* name); - void create(const char* name, TRecnotype nrecord = 10); - void chsize(const char* name, TRecnotype nrecord); - void close(); - void unlink(const char* name); - void read(char* record, TRecnotype recnum, TReclock lock = _nolock); - void write(char* record, TRecnotype recnum, TReclock lock = _nolock); - int status() const ; - int& base() { return _base; } - int& len() { return _len; } - bool ok() const { return status() == NOERR; } - bool error() const { return status() != NOERR; } - - TFile(int lenrec = 0, int base = 0); - virtual ~TFile(); -}; - -// @C -// Classe TDir : public TObject -// -// @END - -class TDir : public TObject -{ -// @DPRIV - FileDes* _dir; - int _num; - -public: -// @FPUB - void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop); - void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop); - void zero(); - - void set_eox(const RecNoType eox); - void set_len(const UINT16 len); - void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc); - - const char* name() const; - const char* des() const; - const char* expr() const; - TRecnotype& eod() const; - TRecnotype& eox() const; - TRecnotype& flags() const; - word& len(); - int status(TDirtype dirtype = _nordir) const ; - int num() const { return _num;} - int items(TDirtype dirtype = _nordir) const; - FileDes* filedesc() const { return _dir; } - - TDir(); - virtual ~TDir(); -}; - -// @C -// Classe TTrec : public TObject -// -// @END - -class TTrec : public TSortable -{ -// @DPRIV - RecDes* _rec; - int _num; -protected: - int compare(const TSortable& a) const; - -public: -// @FPUB - void get(int nfile, TDirtype dirtype = _nordir); - void put(int nfile, TDirtype dirtype = _nordir); - void zero(); - void rehash(); - int status(TDirtype dirtype = _nordir) const ; - int num() const { return _num;} - int field(const char* fieldname) const; - RecDes* rec() const { return _rec;} - TTrec& operator =(const TTrec& b); - int items() const { return _rec->NFields; } - int len() const { return _rec->Fd[items() - 1].RecOff + - _rec->Fd[items() - 1].Len; } - - - TTrec(); - virtual ~TTrec(); -}; - -#endif // __FILES_H - +#ifndef __FILES_H +#define __FILES_H + +#ifndef __OBJECT_H +#include +#endif + +#ifndef __EXTCTYPE_H +#include +#endif + +#ifndef __RECTYPES_H +#include +#endif + +// @C +// Classe TFile : public TObject +// +// Il file. I suoi metodi comprendono tutte le procedure per l'accesso +// fisico di basso livello ai file. +// +// @END + +class TFile : public TObject +{ +// @DPRIV + SecDef* _file; + int _len; + int _base; +public: +// @FPUB + void open(const char* name, TFilelock lockmode = _manulock); + bool verify(const char* name); + void create(const char* name, TRecnotype nrecord = 10); + void chsize(const char* name, TRecnotype nrecord); + void close(); + void unlink(const char* name); + void read(char* record, TRecnotype recnum, TReclock lock = _nolock); + void write(char* record, TRecnotype recnum, TReclock lock = _nolock); + int status() const ; + int& base() { return _base; } + int& len() { return _len; } + bool ok() const { return status() == NOERR; } + bool error() const { return status() != NOERR; } + + TFile(int lenrec = 0, int base = 0); + virtual ~TFile(); +}; + +// @C +// Classe TDir : public TObject +// +// @END + +class TDir : public TObject +{ +// @DPRIV + FileDes* _dir; + int _num; + +public: +// @FPUB + void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop); + void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop); + void zero(); + + void set_eox(const RecNoType eox); + void set_len(const UINT16 len); + void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc); + + const char* name() const; + const char* des() const; + const char* expr() const; + TRecnotype& eod() const; + TRecnotype& eox() const; + TRecnotype& flags() const; + word& len(); + int status(TDirtype dirtype = _nordir) const ; + int num() const { return _num;} + int items(TDirtype dirtype = _nordir) const; + FileDes* filedesc() const { return _dir; } + + TDir(); + virtual ~TDir(); +}; + +// @C +// Classe TTrec : public TObject +// +// @END + +class TTrec : public TSortable +{ +// @DPRIV + RecDes* _rec; + int _num; +protected: + int compare(const TSortable& a) const; + +public: +// @FPUB + void get(int nfile, TDirtype dirtype = _nordir); + void put(int nfile, TDirtype dirtype = _nordir); + void zero(); + void rehash(); + int status(TDirtype dirtype = _nordir) const ; + int num() const { return _num;} + int field(const char* fieldname) const; + RecDes* rec() const { return _rec;} + TTrec& operator =(const TTrec& b); + int fields() const { return _rec->NFields; } + int keys() const { return _rec->NKeys; } + void set_fields(int nfields) { _rec->NFields = nfields;} + void set_keys(int nkeys) { _rec->NKeys = nkeys;} + const char* fielddef(int fld) const; // ritorna una token string + const char* keydef(int key) const; + void update_keydef(int key, const char* desc); //desc e' una token string + void update_fielddef(int nfld, const char* desc); //desc e' una token string + int len() const { return _rec->Fd[fields() - 1].RecOff + + _rec->Fd[fields() - 1].Len; } + virtual void print_on(ostream& out) const; + virtual void read_from(istream& in); + + + TTrec(); + virtual ~TTrec(); +}; + +#endif // __FILES_H +