source: cpp/frams/_demos/loader_test_param.cpp @ 323

Last change on this file since 323 was 323, checked in by Maciej Komosinski, 9 years ago

Example of skipping an unknown object

File size: 4.0 KB
RevLine 
[307]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
4
[308]5#include <frams/param/multiparamload.h>
[307]6#include <frams/virtfile/stdiofile.h>
7#include <frams/errmgr/stdouterr.h>
8
9/**
10 @file
[308]11 Sample code: Loading Framsticks "objects" (structures).
[307]12
[308]13 After loading, objects are printed ("saved") to standard output.
14 Additional information and messages are printed to standard error.
15 You can redirect both streams if needed.
16
[307]17 \include loader_test_param.cpp
18 */
19
20struct Data
21{
22public:
[311]23        SString text, longtext, deftext;
[307]24        int i1, i2, i3;
25        float f1, f2, f3;
26        ExtValue x;
[311]27        int notchanged,notloaded,notsaved;
[307]28};
29
30#define FIELDSTRUCT Data
31ParamEntry data_paramtab[] =
32{
[311]33        { "Data", 1, 12, "data", },
[307]34        { "text", 0, 0, "Text", "s 0 10", FIELD(text), }, // 10 = length limit
35        { "longtext", 0, 0, "Long text", "s 1", FIELD(longtext), }, // 1 = multiline, 0 = unlimited
[311]36        { "deftext", 0, 0, "Text with default value", "s 0 0 some text", FIELD(deftext), },
[307]37        { "i1", 0, 0, "Integer 1", "d", FIELD(i1), },          // unrestricted integer
[308]38        { "i2", 0, 0, "Integer 2", "d -5 5 1", FIELD(i2), }, // [-5..5] integer, default=1
[311]39        { "i3", 0, 0, "Integer 3", "d -1 3 0 ~Minus~Zero~One~Two~Three", FIELD(i3), }, // [0..3] + text labels (Param::getText())
[307]40        { "f1", 0, 0, "Float 1", "d", FIELD(f1), },          // unrestricted float
41        { "f2", 0, 0, "Float 2", "f -100 100 -100", FIELD(f2), }, // [-100..100] float, default=-100
42        { "x", 0, 0, "Untyped", "x", FIELD(x), }, // any type (class ExtValue)
[311]43        { "notchanged", 0, PARAM_READONLY, "Read only field", "d", FIELD(notchanged), }, // neither load() nor setDefault() can change this
44        { "notloaded", 0, PARAM_DONTLOAD, "Unloadable field", "d", FIELD(notloaded), }, // load() does not change this
45        { "notsaved", 0, PARAM_DONTSAVE, "Unsaveable field", "d", FIELD(notsaved), }, // save() skips this field
[307]46        { 0, 0, 0, },
47};
48#undef FIELDSTRUCT
49
50int main(int argc, char*argv[])
51{
52        if (argc < 2)
53        {
54                fprintf(stderr, "Arguments: filename\n");
55                return 1;
56        }
57
58        StdioFILEDontClose virt_stderr(stderr);
[308]59        StdioFILEDontClose virt_stdout(stdout);
[307]60        StdoutErrorHandler error_handler(0, &virt_stderr);
61        StdioFileSystem_autoselect stdiofilesys;
62        MultiParamLoader loader(argv[1]);
63
64        Data data;
65        Param param(data_paramtab, &data);
66
[311]67        data.notchanged=100;
68        data.notloaded=200;
69
[307]70        loader.addObject(&param);
[323]71        loader.breakOn(MultiParamLoader::OnError + MultiParamLoader::BeforeObject + MultiParamLoader::AfterObject + MultiParamLoader::OnComment + MultiParamLoader::BeforeUnknown);
[307]72
73        while (int status = loader.go())
74        {
75                switch (status)
76                {
77                case MultiParamLoader::OnComment:
[316]78                        fprintf(stderr, "comment: '%s'\n", (const char*)loader.getComment());
[307]79                        break;
80
[323]81                case MultiParamLoader::BeforeUnknown:
82                        // At this point we could change our mind and load the unknown object using MultiParamLoader::loadObjectNow() functions.
83                        // It is "unknown", so we would have to provide its ParamInterface.
84                        // In fact, this method is used not just for truly unknown objects but also for
85                        // dynamic objects that cannot be added using MultiParamLoader.addObject().
86                        fprintf(stderr, "unknown object found: '%s' (will be skipped)\n", (const char*)loader.getObjectName());
87                        break;
88
[307]89                case MultiParamLoader::AfterObject:
[308]90                        fprintf(stderr, "loaded:\n");
[307]91                        for (int i = 0; i < param.getPropCount(); i++)
[308]92                                fprintf(stderr, "%s=%s\n", param.id(i), (const char*)param.getText(i));
93                        fprintf(stderr, "type of 'x' is: %s\n", (const char*)data.x.typeDescription());
94                        fprintf(stderr, "-----\n\n");
95                        param.save(&virt_stdout);
[307]96                        break;
97
98                case MultiParamLoader::BeforeObject:
[308]99                        fprintf(stderr, "----- object found, loading...\n");
[311]100                        data.notchanged++;
[307]101                        param.setDefault(); //reset (initialize) struct contents
102                        break;
103
[308]104                case MultiParamLoader::OnError:
[307]105                        fprintf(stderr, "Error: %s", (const char*)loader.getError());
106                }
107        }
[308]108        return 0;
[307]109}
Note: See TracBrowser for help on using the repository browser.