File: tclxmlrpc.C

package info (click to toggle)
saods9 8.6%2Brepack-5
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 23,220 kB
  • sloc: tcl: 78,253; cpp: 71,015; ansic: 3,955; xml: 1,555; sh: 968; makefile: 183; perl: 68
file content (143 lines) | stat: -rw-r--r-- 2,872 bytes parent folder | download | duplicates (2)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright (C) 1999-2024
// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
// For conditions of distribution and use, see copyright notice in "copyright"

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include <iostream>
#include <sstream>
using namespace std;

#include <tcl.h>

#include "tclxmlrpc.h"

// Parser Stuff
#undef yyFlexLexer
#define yyFlexLexer xmlrpcFlexLexer
#include <FlexLexer.h>

void* xmlrpclval;
extern int xmlrpcparse(TclXMLRPC*, xmlrpcFlexLexer*);

int xmlrpclex(void* vval, xmlrpcFlexLexer* ll)
{
  xmlrpclval = vval;
  return ll ? ll->yylex() : 0;
}

void xmlrpcerror(TclXMLRPC* xmlrpc, xmlrpcFlexLexer* ll, const char* m)
{
  xmlrpc->error(m);
  const char* cmd = ll ? ll->YYText() : (const char*)NULL;
  if (cmd && cmd[0] != '\n') {
    xmlrpc->error(": ");
    xmlrpc->error(cmd);
  }
}

extern "C" {
  int Saoxmlrpc_Init(Tcl_Interp* interp);
  int TclxmlrpcCmd(ClientData data, Tcl_Interp *interp, int argc, 
		  const char* argv[]);
}

TclXMLRPC* xmlrpc=NULL;

int Saoxmlrpc_Init(Tcl_Interp* interp) {
  if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL)
    return TCL_ERROR;

  Tcl_CreateCommand(interp, "xmlrpc", TclxmlrpcCmd,
		    (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);

  if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK)
    return TCL_ERROR;

  xmlrpc = new TclXMLRPC(interp);

  if (xmlrpc)
    return TCL_OK;
  else
    return TCL_ERROR;
}

int TclxmlrpcCmd(ClientData data, Tcl_Interp *interp,
		int argc, const char* argv[])
{
  if (argc>=2) {
    if (!strncmp(argv[1], "parse", 5))
      return xmlrpc->parseCmd(argc, argv);
    else {
      Tcl_AppendResult(interp, "xmlrpc: unknown command: ", argv[1], NULL);
      return TCL_ERROR;
    }
  }
  else {
    Tcl_AppendResult(interp, "usage: xmlrpc ?parse?", NULL);
    return TCL_ERROR;
  }
}

// Public Member Functions

TclXMLRPC::TclXMLRPC(Tcl_Interp* interp)
{
  interp_=interp;
  rpc_ =NULL;
}

TclXMLRPC::~TclXMLRPC()
{ 
}

int TclXMLRPC::parseCmd(int argc, const char* argv[])
{
  if (argc!=4) { 
    Tcl_AppendResult(interp_, "usage: xmlrpc parse ?in? ?out?", NULL);
    return TCL_ERROR;
  }
  
  if (!(argv[2] && *argv[2]))
    return TCL_ERROR;

  if (!(argv[3] && *argv[3]))
    return TCL_ERROR;

  char* xml = (char*)Tcl_GetVar(interp_, argv[2], TCL_LEAVE_ERR_MSG);

  string x(xml);
  istringstream str(x);

  Tcl_SetVar(interp_, argv[3], "", NULL);

  if (!parse(str)) {
    if (rpc_) {
      Tcl_SetVar(interp_, argv[3], rpc_, NULL);
      free(rpc_);
      rpc_ =NULL;
      return TCL_OK;
    }
  }

  return TCL_ERROR;
}

int TclXMLRPC::parse(istringstream& istr)
{
  result_ = TCL_OK;
  xmlrpcFlexLexer* ll = new xmlrpcFlexLexer(&istr);
  xmlrpcparse(this, ll);
  delete ll;

  return result_;
}

void TclXMLRPC::error(const char* m)
{
  Tcl_AppendResult(interp_, m, NULL);
  result_ = TCL_ERROR;
}