1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 * Copyright (c) 2006-2024 by Altair Engineering, Inc.
 * All rights reserved.
 *
 * Altair Engineering, Inc. makes this software available as part of the Vision
 * tool platform.  As long as you are a licensee of the Vision tool platform
 * you may make copies of the software and modify it to be used within the
 * Vision tool platform, but you must include all of this notice on any copy.
 * Redistribution without written permission to any third party, with or
 * without modification, is not permitted.
 * Altair Engineering, Inc. does not warrant that this software is error free
 * or fit for any purpose.  Altair Engineering, Inc. disclaims any liability for
 * all claims, expenses, losses, damages and costs any user may incur as a
 * result of using, copying or modifying the software.
 * ============================================================================
 *   @c-code
 *       C-Code Skeleton
 *   @section
 *       C Level Examples
 *   @description
 *       Skeleton that can be used to create a shared object that can be loaded
 *       into the *Vision tools to register new Tcl Object Commands.
 *   @files
 *       zdb/skeleton.c
 *   @tag
 *       zdb gui
 */

#include <tcl.h>

static int testCmd(ClientData, Tcl_Interp*, int, Tcl_Obj* CONST objv[]);


/* ===========================================================================
 * Declare prototypes.
 * ===========================================================================
 */
int Test_Init(Tcl_Interp* interp);


/* ===========================================================================
 * Init Function - Create command "testcmd"
 * ===========================================================================
 */
int Test_Init(Tcl_Interp* interp) {
    if (Tcl_PkgRequire(interp, "Tcl",  "8.6", 0) == NULL) {
        return TCL_ERROR;
    }
    if (Tcl_PkgProvide(interp, "Test", "1.0")  != TCL_OK) {
        return TCL_ERROR;
    }
    Tcl_CreateObjCommand(interp, "testcmd", &testCmd, NULL, NULL);
    return TCL_OK;
}


/* ==================================================================
 * MASTER COMMAND
 *
 * COMMAND: testcmd foo|bar
 *          0       1
 * ==================================================================
 */
static int testCmd(ClientData data, Tcl_Interp* interp, int objc,
     Tcl_Obj* CONST objv[])
{
    static CONST84 char* subCmds[] = {"foo", "bar", NULL};
    int index;

    (void) data; /* Pacify 'unused variable' warning. */

    if (objc < 2) {
        Tcl_WrongNumArgs(interp, 1, objv, "foo|bar ...");
        return TCL_ERROR;
    }
    if (Tcl_GetIndexFromObj(interp, objv[1], subCmds,
        "option", TCL_EXACT, &index) == TCL_ERROR) {
            return TCL_ERROR;
        }

    switch (index) {
        case 0:                 /* foo */
            /* Do something */
            break;
        case 1: {               /* bar */
            /* Do something */
            break;
        }
        default:                /* bad option */
            return TCL_ERROR;
    }
    return TCL_OK;
}