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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Daedalus Research
  16.  * Group at the University of California Berkeley.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen
  34.  */
  35. #include "tclcl.h"
  36. #include "tclcl-internal.h"
  37. #include "tracedvar.h"
  38. #ifdef STDC_HEADERS
  39. #include <stdlib.h>  // for abort() on redhat 7.0beta
  40. #endif /* STDC_HEADERS */
  41. #ifdef TCLCL_USE_STREAM
  42. #include <strstream.h>
  43. enum {
  44. ios__number = ios::basefield + ios::floatfield,
  45. ios__fields = ios::adjustfield + ios::basefield + ios::floatfield,
  46. };
  47. void TracedVar::format(ostrstream& os)
  48. {
  49. // format adjustfield and number field only if iosMask is set
  50. if (iosMask_ & ios::adjustfield)
  51. os.setf(iosMask_, ios::adjustfield);
  52. if (iosMask_ & ios__number)
  53. os.setf(iosMask_, ios__number);
  54. os.setf(iosMask_, ~ios__fields);
  55. }
  56. void TracedVar::format(ostrstream&)
  57. {
  58. }
  59. #endif
  60. TracedVar::TracedVar() : name_(""), owner_(0), tracer_(0),
  61. #ifdef TCLCL_USE_STREAM
  62. iosWidth_(0), iosPrecision_(0), iosMask_(0),
  63. #endif /* TCLCL_USE_STREAM */
  64. next_(0)
  65. {
  66. }
  67. TracedVar::TracedVar(const char* name) : name_(name), owner_(0), tracer_(0),
  68. #ifdef TCLCL_USE_STREAM
  69. iosWidth_(0), iosPrecision_(0), iosMask_(0),
  70. #endif /* TCLCL_USE_STREAM */
  71. next_(0)
  72. {
  73. }
  74. void TracedInt::assign(int newval)
  75. {
  76. // if value changes, set new value and call tracer if exist
  77. if (val_ == newval)
  78. return;
  79. val_ = newval;
  80. if (tracer_)
  81. tracer_->trace(this);
  82. }
  83. char* TracedInt::value(char* buf, int buflen)
  84. {
  85. if (buf == 0)
  86. return 0;
  87. #ifdef TCLCL_USE_STREAM
  88. ostrstream ost(buf, 16 + iosWidth_);
  89. format(ost);
  90. ost.width(iosWidth_);
  91. ost << val_;
  92. #else
  93. // sprintf(buf, "%*d", iosWidth_, val_);
  94. if (-1 == snprintf(buf, buflen, "%d", val_))
  95. abort();
  96. #endif
  97. return buf;
  98. }
  99. void TracedDouble::assign(double newval)
  100. {
  101. // if value changes, set new value and call tracer if exist
  102. if (val_ == newval)
  103. return;
  104. val_ = newval;
  105. if (tracer_)
  106. tracer_->trace(this);
  107. }
  108. char* TracedDouble::value(char* buf, int buflen)
  109. {
  110. if (buf == 0)
  111. return 0;
  112. #ifdef TCLCL_USE_STREAM
  113. ostrstream ost(buf, 16 + iosWidth_);
  114. format(ost);
  115. ost.precision(iosPrecision_);
  116. ost << val_;
  117. #else
  118. // sprintf(buf, "%*.*f", iosWidth_, iosPrecision_, val_);
  119. if (-1 == snprintf(buf, buflen, "%g", val_))
  120. abort();
  121. #endif
  122. return buf;
  123. }