Writing Tcl-Based Applications In C John Ousterhout Sun Microsystems Laboratories john.ousterhout@eng.sun.com Tcl/Tk Tutorial, Part IV.

Презентация:



Advertisements
Похожие презентации
Loader Design Options Linkage Editors Dynamic Linking Bootstrap Loaders.
Advertisements

© 2005 Cisco Systems, Inc. All rights reserved. BGP v Route Selection Using Policy Controls Applying Route-Maps as BGP Filters.
An Introduction To Tcl Scripting John Ousterhout Sun Microsystems Laboratories Tcl/Tk Tutorial, Part II.
Unit II Constructor Cont… Destructor Default constructor.
1/27 Chapter 9: Template Functions And Template Classes.
© 2002 IBM Corporation Confidential | Date | Other Information, if necessary © Wind River Systems, released under EPL 1.0. All logos are TM of their respective.
Running Commands & Getting Help. Running Commands Commands have the following syntax: command options arguments Each item is separated by a space Options.
© Luxoft Training 2013 Annotations. © Luxoft Training 2013 Java reflection / RTTI // given the name of a class, get a "Class" object that // has all info.
© 2005 Cisco Systems, Inc. All rights reserved.INTRO v Managing Your Network Environment Managing Cisco Devices.
© 2005 Cisco Systems, Inc. All rights reserved. BGP v Route Selection Using Attributes Using AS-Path Prepending.
© 2009 Avaya Inc. All rights reserved.1 Chapter Two, Voic Pro Components Module Two – Actions, Variables & Conditions.
© 2006 Cisco Systems, Inc. All rights reserved. MPLS v Complex MPLS VPNs Using Advanced VRF Import and Export Features.
S4-1 PAT328, Section 4, September 2004 Copyright 2004 MSC.Software Corporation SECTION 4 FIELD IMPORT AND EXPORT.
© 2006 Cisco Systems, Inc. All rights reserved. SND v Configuring a Cisco IOS Firewall Configuring a Cisco IOS Firewall with the Cisco SDM Wizard.
Designing Network Management Services © 2004 Cisco Systems, Inc. All rights reserved. Designing the Network Management Architecture ARCH v
© 2009 Avaya Inc. All rights reserved.1 Chapter Four, UMS Web Services Module Three – Exchange 2007.
© 2005 Cisco Systems, Inc. All rights reserved. BGP v Route Selection Using Policy Controls Using Multihomed BGP Networks.
© 2005 Cisco Systems, Inc. All rights reserved. BGP v Route Selection Using Attributes Setting BGP Local Preferences.
Operator Overloading Customised behaviour of operators Chapter: 08 Lecture: 26 & 27 Date:
© 2005 Cisco Systems, Inc. All rights reserved. BGP v Optimizing BGP Scalability Implementing BGP Peer Groups.
Транксрипт:

Writing Tcl-Based Applications In C John Ousterhout Sun Microsystems Laboratories Tcl/Tk Tutorial, Part IV

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 2 Outline u Philosophy: focus on primitives. u Basics: interpreters, executing scripts. u Implementing new commands. u Managing packages; dynamic loading. u Managing the result string. u Useful library procedures: parsing, variables, lists, hash tables.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 3 Philosophy u Usually better to write Tcl scripts than C code: –Faster development (higher level, no compilation). –More flexible. u Why write C? –Need access to low-level facilities (sockets?). –Efficiency concerns (iterative calculations). –Need more structure (code is complex). u Implement new Tcl commands that provide a few simple orthogonal primitives: –Low-level to provide independent access to all key features. –High-level to hide unimportant details, allow efficient implementation.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 4 Example: Weather Reports u Goal: retrieve weather reports over network from servers. u Tcl command set #1: –Retrieve report, format, print on standard output. u Tcl command set #2: –Open socket to weather server. –Select station. –Retrieve first line of report.... u Tcl command set #3: –Return list of available stations. –Given station name, retrieve report. Too high-level (inflexible) Too low-level (tedious) Just right

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 5 Designing New Commands u Choose textual names for objects:.dlg.bottom.ok file3 or stdin –Use hash tables to map to C structures. u Object-oriented commands:.dlg.bottom.ok configure -fg red –Good for small numbers of well-defined objects. –Doesn't pollute name space. –Allows similar commands for different objects. u Action-oriented commands: string compare $x $y –Good if many objects or short-lived objects.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 6 Designing New Commands, cont'd u Formatting command results: –Make them easy to parse with Tcl scripts: tmp 53 hi 68 lo 37 precip.02 sky part –Make them symbolic wherever possible, e.g. not u Use package prefixes in command names and global variables: wthr_stations wthr_report midi_play –Allows packages to coexist without name clashes.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 7 Interpreters Tcl_Interp structure encapsulates execution state: –Variables. –Commands implemented in C. –Tcl procedures. –Execution stack. u Can have many interpreters in a single application (but usually just one). u Creating and deleting interpreters: Tcl_Interp *interp; interp = Tcl_CreateInterp(); Tcl_DeleteInterp(interp);

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 8 Executing Tcl Scripts int code; code = Tcl_Eval(interp, "set a 1"); code = Tcl_EvalFile(interp, "init.tcl"); code indicates success or failure: – TCL_OK : normal completion. – TCL_ERROR : error occurred. interp->result points to string: result or error message. u Application should display result or message for user.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 9 Where Do Scripts Come From? u Read from standard input (see tclMain.c). u Read from script file (see tclMain.c). u Associate with X events, wait for events, invoke associated scripts (see tkMain.c).

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 10 Creating New Tcl Commands u Write command procedure in C: int EqCmd(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { if (argc != 3) { interp->result = "wrong # args"; return TCL_ERROR; } if (strcmp(argv[1], argv[2]) == 0) { interp->result = "1"; } else { interp->result = "0"; } return TCL_OK; }

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 11 Creating New Tcl Commands, cont'd u Register with interpreter: Tcl_CreateCommand(interp, "eq", EqCmd, (ClientData) NULL,...); Tcl_DeleteCommand(interp, "eq"); Once registered, EqCmd will be called whenever eq command is invoked in interp.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 12 ClientData Tcl_CreateCommand(interp, "eq", EqCmd, clientData,...); int EqCmd(ClientData clientData,...) {...} u Used to pass any one-word value to command procedures and other callbacks. clientData is usually a pointer to data structure manipulated by procedure. Cast pointers in and out of ClientData type: – Tcl_CreateCommand(... (ClientData) gizmoPtr,...); – gizmoPtr = (Gizmo *) clientData;

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 13 Conventions For Packages Goal: make it easy to develop and use Tcl extensions. 1. Use package prefixes to prevent name conflicts: –Pick short prefix for package, e.g. rdb. –Use in all global names: »C procedure: Rdb_Open »C variable: rdb_NumRecords »Tcl command: rdb_query –See Tcl book and Tcl/Tk Engineering Manual for more details.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 14 Packages, cont'd 2. Create package initialization procedure: –Named after package: Rdb_Init. –Creates package's commands. –Evaluates startup script, if any. int Rdb_Init(Tcl_Interp *interp) { Tcl_CreateCommand(...); Tcl_CreateCommand(...);... return Tcl_EvalFile(interp, "/usr/local/lib/rdb/init.tcl"); }

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 15 Packages, cont'd 3. To use package: –Compile as shared library, e.g. on Solaris: cc -K pic -c rdb.c ld -G -z text rdb.o -o rdb.so –Dynamically load into tclsh or wish : load rdb.so Rdb –Tcl will call Rdb_Init to initialize the package.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 16 Managing The Result String Need conventions for interp->result : –Permit results of any length. –Avoid malloc overheads if possible. –Avoid storage reclamation problems. –Keep as simple as possible. u Normal state of interpreter (e.g., whenever command procedure is invoked): u Default: command returns empty string. result "" freeProc interp

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 17 Result String, cont'd u Option 1: (semi-) static result. interp->result = "0"; u Option 2: use pre-allocated space in interp. sprintf(interp->result, "Value is %d", i); result "" freeProc interp result "Value is 2" freeProc interp "0" ~200 bytes

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 18 Result String, cont'd u Option 3: allocate new space for result. interp->result = malloc(2000);... interp->freeProc = free; Tcl will call freeProc (if not NULL) to dispose of result. Mechanism supports storage allocators other than malloc / free. result "" free freeProc interp

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 19 Procedures For Managing Result u Option 4: use library procedures. Tcl_SetResult(interp, string,...); Tcl_AppendResult(interp, string, string,... string, (char *) NULL); Tcl_AppendElement(interp, string); Tcl_ResetResult(interp);

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 20 Utility Procedures: Parsing u Used by command procedures to parse arguments: int value, code; code = Tcl_GetInt(interp, argv[1], &value); Stores integer in value. Returns TCL_OK or TCL_ERROR. If parse error, returns TCL_ERROR and leaves message in interp->result. u Other procedures: Tcl_GetDoubleTcl_ExprDouble Tcl_GetBooleanTcl_ExprBoolean Tcl_ExprLongTcl_ExprString

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 21 Utility Procedures: Variables u Read, write, and unset: char *value; value = Tcl_GetVar(interp, "a",...); Tcl_SetVar(interp, "a", "new",...); Tcl_UnsetVar(interp, "a",...); u Set traces: Tcl_TraceVar(interp, "a", TCL_TRACE_READS|TCL_TRACE_WRITES, traceProc, clientData); traceProc will be called during each read or write of a : –Can monitor accesses. –Can override value read or written.

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 22 Other Utility Procedures u Parsing, assembling proper lists: Tcl_SplitList(...) Tcl_Merge(...) u Flexible hash tables: Tcl_InitHashTable(...) Tcl_CreateHashEntry(...) Tcl_FindHashEntry(...) Tcl_DeleteHashEntry(...) Tcl_DeleteHashTable(...) u Dynamic strings: Tcl_DStringInit(...) Tcl_DStringAppend(...) Tcl_DStringAppendElement(...) Tcl_DStringValue(...) Tcl_DStringFree(...)

Tcl/Tk Tutorial Part IV: Tcl C InterfacesDecember 12, 1995, slide 23 Summary u Interfaces to C are simple: Tcl was designed to make this true. u Focus on primitives, use Tcl scripts to compose fancy features.