misc.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1994 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * miscellaneous "ns" commands
  35.  */
  36. #ifndef lint
  37. static const char rcsid[] =
  38.     "@(#) $Header: /cvsroot/nsnam/ns-2/common/misc.cc,v 1.14 2002/06/04 23:25:19 haldar Exp $ (LBL)";
  39. #endif
  40. #include <stdlib.h>
  41. #include <math.h>
  42. #ifndef WIN32
  43. #include <sys/time.h>
  44. #endif
  45. #include <ctype.h>
  46. #include "config.h"
  47. #include "scheduler.h"
  48. #include "random.h"
  49. #if defined(HAVE_INT64)
  50. class Add64Command : public TclCommand {
  51. public: 
  52. Add64Command() : TclCommand("ns-add64") {}
  53. virtual int command(int argc, const char*const* argv);
  54. };
  55. int Add64Command::command(int argc, const char*const* argv)
  56. {
  57. Tcl& tcl = Tcl::instance();
  58. if (argc == 3) {
  59. char res[22]; /* A 64 bit int at most 20 digits */
  60. int64_t d1 = STRTOI64(argv[1], NULL, 0);
  61. int64_t d2 = STRTOI64(argv[2], NULL, 0);
  62. sprintf(res, STRTOI64_FMTSTR, d1+d2);
  63. tcl.resultf("%s", res);
  64. return (TCL_OK);
  65. }
  66. tcl.add_error("ns-add64 requires two arguments.");
  67. return (TCL_ERROR);
  68. }
  69. class Mult64Command : public TclCommand {
  70. public: 
  71. Mult64Command() : TclCommand("ns-mult64") {}
  72. virtual int command(int argc, const char*const* argv);
  73. };
  74. int Mult64Command::command(int argc, const char*const* argv)
  75. {
  76. Tcl& tcl = Tcl::instance();
  77. if (argc == 3) {
  78. char res[22]; /* A 64 bit int at most 20 digits */
  79. int64_t d1 = STRTOI64(argv[1], NULL, 0);
  80. int64_t d2 = STRTOI64(argv[2], NULL, 0);
  81. sprintf(res, STRTOI64_FMTSTR, d1*d2);
  82. tcl.resultf("%s", res);
  83. return (TCL_OK);
  84. }
  85. tcl.add_error("ns-mult64 requires two arguments.");
  86. return (TCL_ERROR);
  87. }
  88. class Int64ToDoubleCommand : public TclCommand {
  89. public: 
  90. Int64ToDoubleCommand() : TclCommand("ns-int64todbl") {}
  91. virtual int command(int argc, const char*const* argv);
  92. };
  93. int Int64ToDoubleCommand::command(int argc, const char*const* argv)
  94. {
  95. Tcl& tcl = Tcl::instance();
  96. if (argc == 2) {
  97. char res[22]; /* A 64 bit int at most 20 digits */
  98. int64_t d1 = STRTOI64(argv[1], NULL, 0);
  99. double  d2 = d1;
  100. sprintf(res, "%.1f",d2);
  101. tcl.resultf("%s", res);
  102. return (TCL_OK);
  103. }
  104. tcl.add_error("ns-int64todbl requires only one arguments.");
  105. return (TCL_ERROR);
  106. }
  107. #endif
  108. class HasInt64Command : public TclCommand {
  109. public: 
  110. HasInt64Command() : TclCommand("ns-hasint64") {}
  111. virtual int command(int argc, const char*const* argv);
  112. };
  113. int HasInt64Command::command(int argc, const char*const* argv)
  114. {
  115. Tcl& tcl = Tcl::instance();
  116. char res[2];
  117. int flag = 0; 
  118. #if defined(HAVE_INT64)
  119. flag = 1; 
  120. #endif
  121. sprintf(res, "%d", flag);
  122. tcl.resultf("%s", res);
  123. return (TCL_OK);
  124. }
  125. class RandomCommand : public TclCommand {
  126. public:
  127. RandomCommand() : TclCommand("ns-random") { }
  128. virtual int command(int argc, const char*const* argv);
  129. };
  130. /*
  131.  * ns-random
  132.  * ns-random $seed 
  133.  */
  134. int RandomCommand::command(int argc, const char*const* argv)
  135. {
  136. Tcl& tcl = Tcl::instance();
  137. if (argc == 1) {
  138. sprintf(tcl.buffer(), "%u", Random::random());
  139. tcl.result(tcl.buffer());
  140. } else if (argc == 2) {
  141. int seed = atoi(argv[1]);
  142. if (seed == 0)
  143. seed = Random::seed_heuristically();
  144. else
  145. Random::seed(seed);
  146. tcl.resultf("%d", seed);
  147. }
  148. return (TCL_OK);
  149. }
  150. extern "C" char version_string[];
  151. class VersionCommand : public TclCommand {
  152. public:
  153. VersionCommand() : TclCommand("ns-version") { }
  154. virtual int command(int, const char*const*) {
  155. Tcl::instance().result(version_string);
  156. return (TCL_OK);
  157. }
  158. };
  159. class HasSTLCommand : public TclCommand {
  160. public:
  161. HasSTLCommand() : TclCommand("ns-hasSTL") {}
  162. virtual int command(int argc, const char*const* argv);
  163. };
  164. int HasSTLCommand::command(int argc, const char*const* argv) 
  165. {
  166. Tcl& tcl = Tcl::instance();
  167. char res[2];
  168. int flag = 0;
  169.         #if defined(HAVE_STL)
  170. flag = 1;
  171.         #endif
  172. sprintf(res, "%d", flag);
  173. tcl.resultf("%s", res);
  174. return (TCL_OK);
  175. }
  176. class TimeAtofCommand : public TclCommand {
  177. public:
  178. TimeAtofCommand() : TclCommand("time_atof") { }
  179. virtual int command(int argc, const char*const* argv) {
  180. if (argc != 2)
  181. return (TCL_ERROR);
  182. char* s = (char*) argv[1];
  183. char wrk[32];
  184. char* cp = wrk;
  185. while (isdigit(*s) || *s == 'e' ||
  186.        *s == '+' || *s == '-' || *s == '.')
  187. *cp++ = *s++;
  188. *cp = 0;
  189. double v = atof(wrk);
  190. switch (*s) {
  191. case 'm':
  192. v *= 1e-3;
  193. break;
  194. case 'u':
  195. v *= 1e-6;
  196. break;
  197. case 'n':
  198. v *= 1e-9;
  199. break;
  200. case 'p':
  201. v *= 1e-12;
  202. break;
  203. }
  204. Tcl::instance().resultf("%g", v);
  205. return (TCL_OK);
  206. }
  207. };
  208. void init_misc(void)
  209. {
  210. (void)new VersionCommand;
  211. (void)new RandomCommand;
  212. (void)new TimeAtofCommand;
  213. (void)new HasInt64Command;
  214. (void)new HasSTLCommand;
  215. #if defined(HAVE_INT64)
  216. (void)new Add64Command;
  217. (void)new Mult64Command;
  218. (void)new Int64ToDoubleCommand;
  219. #endif
  220. }