Check-in [f7fcb93321]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:merge with trunk
Timelines: family | ancestors | descendants | both | wtf-8-experiment
Files: files | file ages | folders
SHA1: f7fcb93321efdb370cc7ee07ca74780fe80f7208
User & Date: chw 2019-07-13 20:56:24
Context
2019-07-16
05:01
merge with trunk check-in: c274bfeaf1 user: chw tags: wtf-8-experiment
2019-07-13
20:56
merge with trunk check-in: f7fcb93321 user: chw tags: wtf-8-experiment
20:55
better error handling w.r.t. check-in [f125b3dc59] check-in: 4dcaf5f047 user: chw tags: trunk
05:27
merge with trunk check-in: 027300a91d user: chw tags: wtf-8-experiment
Changes

Changes to jni/tclkit/vqtcl/library/mkclvfs.tcl.

32
33
34
35
36
37
38


39
40
41
42
43
44
45
        set done 0
        if {![catch {::file system $mkfile} fs] && ($fs ne "native")} {
            if {![catch {::open $mkfile rb} f]} {
                if {![catch {::read $f} data]} {
                    ::close $f
                    set v::rootv($db) [vget [vload $data] 0 dirs]
                    set done 1


                }
            }
        }
        if {!$done} {
            set v::rootv($db) [vget [vopen $mkfile] 0 dirs]
        }
        set v::dname($db) [vget $v::rootv($db) * name]







>
>







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        set done 0
        if {![catch {::file system $mkfile} fs] && ($fs ne "native")} {
            if {![catch {::open $mkfile rb} f]} {
                if {![catch {::read $f} data]} {
                    ::close $f
                    set v::rootv($db) [vget [vload $data] 0 dirs]
                    set done 1
                } else {
                    ::close $f
                }
            }
        }
        if {!$done} {
            set v::rootv($db) [vget [vopen $mkfile] 0 dirs]
        }
        set v::dname($db) [vget $v::rootv($db) * name]

Changes to undroid/build-undroidwish-macosx.sh.

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
133
134
135
136
137
138
139



140
141
142
143
144
145
146
...
259
260
261
262
263
264
265






266
267
268
269
270
271
272
....
1311
1312
1313
1314
1315
1316
1317



























1318
1319
1320
1321
1322
1323
1324
....
1485
1486
1487
1488
1489
1490
1491

1492

1493
1494
1495
1496
1497
1498
1499
SUBDIRS="${SUBDIRS} tls libwebsockets"
SUBDIRS="${SUBDIRS} Memchan TclCurl freetype SDL2 sdl2tk blt jpeg-turbo"
SUBDIRS="${SUBDIRS} 3dcanvas tkimg trf tktable tktreectrl tkpath itk tkhtml"
SUBDIRS="${SUBDIRS} dbus-tcl dbus-intf tclx libdmtx ZBar zint tcl-augeas"
SUBDIRS="${SUBDIRS} snack tkvnc tksvg VecTcl tclral"
SUBDIRS="${SUBDIRS} tclepeg tcluvc xotcl nsf vu rl_json mpexpr"
SUBDIRS="${SUBDIRS} tclcsv tkzinc libffi ffidl tcl-lmdb DiffUtilTcl"
SUBDIRS="${SUBDIRS} tclparser tclcompiler tserialport topcua parse_args tkvlc"
SUBDIRS="${SUBDIRS} tclJBlend"

ACTION="$1"
if test -z "$ACTION" ; then
  ACTION=build
fi

clean_build_stamps() {
................................................................................
      xotcl|nsf)
        rm -f ${i}/*.o ${i}/generic/stubs*/*.o
        rm -f ${i}/build-stamp
        ;;
      mpexpr)
        rm -f ${i}/unix/build-stamp
        ;;



      libwebsockets)
        rm -f ${i}/build/build-stamp
        ;;
      *)
        rm -f ${i}/build-stamp
        ;;
     esac
................................................................................
          if test "$ACTION" = "distclean" ; then
            rm -rf libwebsockets/build
          else
            make -C libwebsockets/build ${ACTION} || true
          fi
        ) || true
        ;;






      *)
        (
          exec >> build.log 2>&1
          make -C $i ${ACTION} || true
        ) || true
        ;;
     esac
................................................................................
    ./configure --prefix=${PFX} \
    --with-tcl=${HERE}/tcl/macosx --enable-threads || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  touch build-stamp
  echo >&3 "done"
) || fail




























echo -n "build tserialport ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd tserialport
  test -e build-stamp && echo >&3 "already done" && exit 0
................................................................................
  cp -rp ${AWDIR}/assets/tksqlite* assets
  cp -rp ${AWDIR}/assets/twdbgi* assets
  cp -rp ${AWDIR}/assets/upnp* assets
  cp -rp ${AWDIR}/assets/ukaz* assets
  cp -rp ${AWDIR}/assets/wibble* assets
  cp -rp ${AWDIR}/assets/stardom* assets
  cp -rp ${AWDIR}/assets/modbus* assets

  cp -rp ${AWDIR}/assets/snap7* assets

  # BLT fixups
  cp -p ${PFX_HERE}/lib/blt*/libBLT* assets/blt*
  cp -p ${PFX_HERE}/lib/blt*/pkgIndex* assets/blt*
  # some demos
  cp -p ${AWDIR}/assets/tkimg*/demo.tcl assets/Img*
  cp -rp ${AWDIR}/assets/Canvas3d*/demo assets/Canvas3d*
  if test -d assets/tcluvc* ; then







|
|







 







>
>
>







 







>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>

>







89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
...
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
....
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
....
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
SUBDIRS="${SUBDIRS} tls libwebsockets"
SUBDIRS="${SUBDIRS} Memchan TclCurl freetype SDL2 sdl2tk blt jpeg-turbo"
SUBDIRS="${SUBDIRS} 3dcanvas tkimg trf tktable tktreectrl tkpath itk tkhtml"
SUBDIRS="${SUBDIRS} dbus-tcl dbus-intf tclx libdmtx ZBar zint tcl-augeas"
SUBDIRS="${SUBDIRS} snack tkvnc tksvg VecTcl tclral"
SUBDIRS="${SUBDIRS} tclepeg tcluvc xotcl nsf vu rl_json mpexpr"
SUBDIRS="${SUBDIRS} tclcsv tkzinc libffi ffidl tcl-lmdb DiffUtilTcl"
SUBDIRS="${SUBDIRS} tclparser tclcompiler snap7 libmodbus tserialport"
SUBDIRS="${SUBDIRS} topcua parse_args tkvlc tclJBlend"

ACTION="$1"
if test -z "$ACTION" ; then
  ACTION=build
fi

clean_build_stamps() {
................................................................................
      xotcl|nsf)
        rm -f ${i}/*.o ${i}/generic/stubs*/*.o
        rm -f ${i}/build-stamp
        ;;
      mpexpr)
        rm -f ${i}/unix/build-stamp
        ;;
      snap7)
        rm -f ${i}/build/osx/build-stamp
        ;;
      libwebsockets)
        rm -f ${i}/build/build-stamp
        ;;
      *)
        rm -f ${i}/build-stamp
        ;;
     esac
................................................................................
          if test "$ACTION" = "distclean" ; then
            rm -rf libwebsockets/build
          else
            make -C libwebsockets/build ${ACTION} || true
          fi
        ) || true
        ;;
      snap7)
        (
          exec >> build.log 2>&1
          make -C snap7/build/osx -f osx.mk clean || true
        ) || true
        ;;
      *)
        (
          exec >> build.log 2>&1
          make -C $i ${ACTION} || true
        ) || true
        ;;
     esac
................................................................................
    ./configure --prefix=${PFX} \
    --with-tcl=${HERE}/tcl/macosx --enable-threads || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build snap7 ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd snap7/build/osx
  test -e build-stamp && echo >&3 "already done" && exit 0
  make -f osx.mk || exit 1
  $STRIP ../bin/*.dylib || true
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build libmodbus ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd libmodbus
  test -e build-stamp && echo >&3 "already done" && exit 0
  DESTDIR=${HERE} ./configure --prefix=${PFX} --disable-tests \
    --disable-static --enable-shared --without-documentation || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  $STRIP ${PFX_HERE}/lib/libmodbus.dylib || true
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build tserialport ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd tserialport
  test -e build-stamp && echo >&3 "already done" && exit 0
................................................................................
  cp -rp ${AWDIR}/assets/tksqlite* assets
  cp -rp ${AWDIR}/assets/twdbgi* assets
  cp -rp ${AWDIR}/assets/upnp* assets
  cp -rp ${AWDIR}/assets/ukaz* assets
  cp -rp ${AWDIR}/assets/wibble* assets
  cp -rp ${AWDIR}/assets/stardom* assets
  cp -rp ${AWDIR}/assets/modbus* assets
  cp -p ${PFX_HERE}/lib/libmodbus.dylib assets/modbus*
  cp -rp ${AWDIR}/assets/snap7* assets
  cp -p snap7/build/bin/libsnap7* assets/snap7*
  # BLT fixups
  cp -p ${PFX_HERE}/lib/blt*/libBLT* assets/blt*
  cp -p ${PFX_HERE}/lib/blt*/pkgIndex* assets/blt*
  # some demos
  cp -p ${AWDIR}/assets/tkimg*/demo.tcl assets/Img*
  cp -rp ${AWDIR}/assets/Canvas3d*/demo assets/Canvas3d*
  if test -d assets/tcluvc* ; then

Changes to undroid/build-vanilla-macosx.sh.

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
134
135
136
137
138
139
140



141
142
143
144
145
146
147
...
250
251
252
253
254
255
256






257
258
259
260
261
262
263
....
1227
1228
1229
1230
1231
1232
1233



























1234
1235
1236
1237
1238
1239
1240
....
1415
1416
1417
1418
1419
1420
1421

1422

1423
1424
1425
1426
1427
1428
1429
SUBDIRS="tcl libressl zlib curl tcludp tdom tclvfs tclkit trofs tbcload tls"
SUBDIRS="${SUBDIRS} Memchan TclCurl sdl2tk jpeg-turbo"
SUBDIRS="${SUBDIRS} 3dcanvas tkimg trf tktable tktreectrl tkpath itk tkhtml"
SUBDIRS="${SUBDIRS} dbus-tcl dbus-intf tclx libdmtx ZBar zint tcl-augeas"
SUBDIRS="${SUBDIRS} snack tkvnc tksvg VecTcl tclral"
SUBDIRS="${SUBDIRS} tclepeg tcluvc xotcl nsf vu rl_json tkdnd mpexpr"
SUBDIRS="${SUBDIRS} tclcsv libffi ffidl tcl-lmdb DiffUtilTcl"
SUBDIRS="${SUBDIRS} tclparser tclcompiler tserialport topcua parse_args tkvlc"
SUBDIRS="${SUBDIRS} tclJBlend twv"

ACTION="$1"
if test -z "$ACTION" ; then
  ACTION=build
fi

clean_build_stamps() {
................................................................................
      xotcl|nsf)
        rm -f ${i}/*.o ${i}/generic/stubs*/*.o
        rm -f ${i}/build-stamp
        ;;
      mpexpr)
        rm -f ${i}/unix/build-stamp
        ;;



      *)
        rm -f ${i}/build-stamp
        ;;
     esac
  done
}

................................................................................
      tdom)
        (
          exec >> build.log 2>&1
          make -C tdom ${ACTION} || true
          make -C tdom/extensions/tnc ${ACTION} || true
        ) || true
        ;;






      *)
        (
          exec >> build.log 2>&1
          make -C $i ${ACTION} || true
        ) || true
        ;;
     esac
................................................................................
    ./configure --prefix=${PFX} \
    --with-tcl=${HERE}/tcl/macosx --enable-threads || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  touch build-stamp
  echo >&3 "done"
) || fail




























echo -n "build tserialport ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd tserialport
  test -e build-stamp && echo >&3 "already done" && exit 0
................................................................................
  cp -rp ${AWDIR}/assets/tksqlite* assets
  cp -rp ${AWDIR}/assets/twdbgi* assets
  cp -rp ${AWDIR}/assets/upnp* assets
  cp -rp ${AWDIR}/assets/ukaz* assets
  cp -rp ${AWDIR}/assets/wibble* assets
  cp -rp ${AWDIR}/assets/stardom* assets
  cp -rp ${AWDIR}/assets/modbus* assets

  cp -rp ${AWDIR}/assets/snap7* assets

  # some demos
  cp -p ${AWDIR}/assets/tkimg*/demo.tcl assets/Img*
  cp -rp ${AWDIR}/assets/Canvas3d*/demo assets/Canvas3d*
  if test -d assets/tcluvc* ; then
    cp -rp ${HERE}/tcluvc*/demos assets/tcluvc*
  fi
  cp -rp ${PFX_HERE}/lib/vectcl0* assets







|
|







 







>
>
>







 







>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>

>







89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
...
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
....
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
....
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
SUBDIRS="tcl libressl zlib curl tcludp tdom tclvfs tclkit trofs tbcload tls"
SUBDIRS="${SUBDIRS} Memchan TclCurl sdl2tk jpeg-turbo"
SUBDIRS="${SUBDIRS} 3dcanvas tkimg trf tktable tktreectrl tkpath itk tkhtml"
SUBDIRS="${SUBDIRS} dbus-tcl dbus-intf tclx libdmtx ZBar zint tcl-augeas"
SUBDIRS="${SUBDIRS} snack tkvnc tksvg VecTcl tclral"
SUBDIRS="${SUBDIRS} tclepeg tcluvc xotcl nsf vu rl_json tkdnd mpexpr"
SUBDIRS="${SUBDIRS} tclcsv libffi ffidl tcl-lmdb DiffUtilTcl"
SUBDIRS="${SUBDIRS} tclparser tclcompiler snap7 libmodbus tserialport"
SUBDIRS="${SUBDIRS} topcua parse_args tkvlc tclJBlend twv"

ACTION="$1"
if test -z "$ACTION" ; then
  ACTION=build
fi

clean_build_stamps() {
................................................................................
      xotcl|nsf)
        rm -f ${i}/*.o ${i}/generic/stubs*/*.o
        rm -f ${i}/build-stamp
        ;;
      mpexpr)
        rm -f ${i}/unix/build-stamp
        ;;
      snap7)
        rm -f ${i}/build/osx/build-stamp
        ;;
      *)
        rm -f ${i}/build-stamp
        ;;
     esac
  done
}

................................................................................
      tdom)
        (
          exec >> build.log 2>&1
          make -C tdom ${ACTION} || true
          make -C tdom/extensions/tnc ${ACTION} || true
        ) || true
        ;;
      snap7)
        (
          exec >> build.log 2>&1
          make -C snap7/build/osx -f osx.mk clean || true
        ) || true
        ;;
      *)
        (
          exec >> build.log 2>&1
          make -C $i ${ACTION} || true
        ) || true
        ;;
     esac
................................................................................
    ./configure --prefix=${PFX} \
    --with-tcl=${HERE}/tcl/macosx --enable-threads || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build snap7 ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd snap7/build/osx
  test -e build-stamp && echo >&3 "already done" && exit 0
  make -f osx.mk || exit 1
  $STRIP ../bin/*.dylib || true
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build libmodbus ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd libmodbus
  test -e build-stamp && echo >&3 "already done" && exit 0
  DESTDIR=${HERE} ./configure --prefix=${PFX} --disable-tests \
    --disable-static --enable-shared --without-documentation || exit 1
  make || exit 1
  make install DESTDIR=${HERE} || exit 1
  $STRIP ${PFX_HERE}/lib/libmodbus.dylib || true
  touch build-stamp
  echo >&3 "done"
) || fail

echo -n "build tserialport ... "
(
  exec 3>&1
  exec >> build.log 2>&1
  cd tserialport
  test -e build-stamp && echo >&3 "already done" && exit 0
................................................................................
  cp -rp ${AWDIR}/assets/tksqlite* assets
  cp -rp ${AWDIR}/assets/twdbgi* assets
  cp -rp ${AWDIR}/assets/upnp* assets
  cp -rp ${AWDIR}/assets/ukaz* assets
  cp -rp ${AWDIR}/assets/wibble* assets
  cp -rp ${AWDIR}/assets/stardom* assets
  cp -rp ${AWDIR}/assets/modbus* assets
  cp -p ${PFX_HERE}/lib/libmodbus.dylib assets/modbus*
  cp -rp ${AWDIR}/assets/snap7* assets
  cp -p snap7/build/bin/libsnap7* assets/snap7*
  # some demos
  cp -p ${AWDIR}/assets/tkimg*/demo.tcl assets/Img*
  cp -rp ${AWDIR}/assets/Canvas3d*/demo assets/Canvas3d*
  if test -d assets/tcluvc* ; then
    cp -rp ${HERE}/tcluvc*/demos assets/tcluvc*
  fi
  cp -rp ${PFX_HERE}/lib/vectcl0* assets

Added undroid/snap7/build/osx/common.mk.

























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
#
# Common for every unix flavour (any changes will be reflected on all platforms)
#
IntermediateDirectory  := ../temp
OutDir                 := $(IntermediateDirectory)
LinkerName             := $(CXX)
SharedObjectLinkerName := $(CC) -shared -fPIC -Wno-inline-new-delete
DebugSwitch            := -g
IncludeSwitch          := -I
LibrarySwitch          := -l
OutputSwitch           := -o 
LibraryPathSwitch      := -L
PreprocessorSwitch     := -D
SourceSwitch           := -c 
OutputFile             := ../bin/libsnap7.dylib
PreprocessOnlySwitch   := -E 
MakeDirCommand         := mkdir -p
LinkOptions            := -O3
IncludePath            := $(IncludeSwitch). $(IncludeSwitch)../../src/sys $(IncludeSwitch)../../src/core $(IncludeSwitch)../../src/lib 
Libs                   := $(LibrarySwitch)pthread
LibPath                := $(LibraryPathSwitch). 

##
## Common variables (CXXFLAGS varies across platforms)
##

##
## User defined environment variables
##
Objects= \
	  $(IntermediateDirectory)/sys_snap_msgsock.o \
	  $(IntermediateDirectory)/sys_snap_sysutils.o \
	  $(IntermediateDirectory)/sys_snap_tcpsrvr.o \
	  $(IntermediateDirectory)/sys_snap_threads.o \
	  $(IntermediateDirectory)/core_s7_client.o \
	  $(IntermediateDirectory)/core_s7_isotcp.o \
	  $(IntermediateDirectory)/core_s7_partner.o \
	  $(IntermediateDirectory)/core_s7_peer.o \
	  $(IntermediateDirectory)/core_s7_server.o \
	  $(IntermediateDirectory)/core_s7_text.o \
	  $(IntermediateDirectory)/core_s7_micro_client.o \
	  $(IntermediateDirectory)/lib_snap7_libmain.o 

##
## Main Build Targets 
##
.PHONY: all clean install PreBuild PostBuild
all: $(OutputFile)

$(OutputFile): $(IntermediateDirectory)/.d $(Objects) 
	@$(MakeDirCommand) $(@D)
	@$(MakeDirCommand) $(IntermediateDirectory)
	$(SharedObjectLinkerName) $(OutputSwitch)$(OutputFile) $(Objects) $(LibPath) $(Libs) $(LinkOptions)
	$(RM) $(ObjectsFileList)

$(IntermediateDirectory)/.d:
	@$(MakeDirCommand) $(IntermediateDirectory)

PreBuild:

PostBuild:

##
## Objects
##
$(IntermediateDirectory)/sys_snap_msgsock.o: 
	$(CXX) $(SourceSwitch) "../../src/sys/snap_msgsock.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/sys_snap_msgsock.o $(IncludePath)

$(IntermediateDirectory)/sys_snap_sysutils.o:
	$(CXX) $(SourceSwitch) "../../src/sys/snap_sysutils.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/sys_snap_sysutils.o $(IncludePath)

$(IntermediateDirectory)/sys_snap_tcpsrvr.o:
	$(CXX) $(SourceSwitch) "../../src/sys/snap_tcpsrvr.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/sys_snap_tcpsrvr.o $(IncludePath)

$(IntermediateDirectory)/sys_snap_threads.o:
	$(CXX) $(SourceSwitch) "../../src/sys/snap_threads.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/sys_snap_threads.o $(IncludePath)

$(IntermediateDirectory)/core_s7_client.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_client.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_client.o $(IncludePath)

$(IntermediateDirectory)/core_s7_isotcp.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_isotcp.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_isotcp.o $(IncludePath)

$(IntermediateDirectory)/core_s7_partner.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_partner.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_partner.o $(IncludePath)

$(IntermediateDirectory)/core_s7_peer.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_peer.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_peer.o $(IncludePath)

$(IntermediateDirectory)/core_s7_server.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_server.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_server.o $(IncludePath)

$(IntermediateDirectory)/core_s7_text.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_text.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_text.o $(IncludePath)

$(IntermediateDirectory)/core_s7_micro_client.o:
	$(CXX) $(SourceSwitch) "../../src/core/s7_micro_client.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/core_s7_micro_client.o $(IncludePath)

$(IntermediateDirectory)/lib_snap7_libmain.o:
	$(CXX) $(SourceSwitch) "../../src/lib/snap7_libmain.cpp" $(CXXFLAGS) -o $(IntermediateDirectory)/lib_snap7_libmain.o $(IncludePath)

##
## Clean / Install
##
clean:
	$(RM) $(IntermediateDirectory)/*.o
	$(RM) $(OutputFile)

Added undroid/snap7/build/osx/osx.mk.

















>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
##
## generic makefile
##
CXXFLAGS   := -O3 -fPIC -pedantic -fno-rtti -fno-exceptions -fno-stack-protector

# Standard part

include common.mk

Changes to undroid/snap7/examples/cpp/snap7.h.

51
52
53
54
55
56
57



58
59
60
61
62
63
64

#if BSD>=0
# define OS_BSD
#endif

#if defined(__APPLE__)
# define OS_OSX



#endif

#if defined(__HAIKU__)
# define OS_HAIKU
# if !defined(PLATFORM_UNIX)
#   define PLATFORM_UNIX
# endif







>
>
>







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

#if BSD>=0
# define OS_BSD
#endif

#if defined(__APPLE__)
# define OS_OSX
# ifndef PLATFORM_UNIX
#  define PLATFORM_UNIX
# endif
#endif

#if defined(__HAIKU__)
# define OS_HAIKU
# if !defined(PLATFORM_UNIX)
#   define PLATFORM_UNIX
# endif

Changes to undroid/snap7/src/sys/snap_platform.h.

42
43
44
45
46
47
48



49
50
51
52
53
54
55

#if BSD>=0
# define OS_BSD
#endif

#if __APPLE__
# define OS_OSX



#endif

#if defined(__SVR4) || defined(__svr4__)
# define OS_SOLARIS
// Thanks to Rolf Stalder now it's possible to use pthreads also for Solaris
// In any case the Solaris native threads model is still present and can be
// used uncommenting the #define line below.







>
>
>







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

#if BSD>=0
# define OS_BSD
#endif

#if __APPLE__
# define OS_OSX
# ifndef PLATFORM_UNIX
#  define PLATFORM_UNIX
# endif
#endif

#if defined(__SVR4) || defined(__svr4__)
# define OS_SOLARIS
// Thanks to Rolf Stalder now it's possible to use pthreads also for Solaris
// In any case the Solaris native threads model is still present and can be
// used uncommenting the #define line below.

Changes to undroid/snap7/src/sys/snap_sysutils.h.

25
26
27
28
29
30
31

32

33
34
35
36
37
38
39
|=============================================================================*/
#ifndef snap_sysutils_h
#define snap_sysutils_h
//---------------------------------------------------------------------------
#include "snap_platform.h"
//---------------------------------------------------------------------------
#ifdef OS_OSX

# define CLOCK_MONOTONIC 0

#endif

longword SysGetTick();
void SysSleep(longword Delay_ms);
longword DeltaTime(longword &Elapsed);

#endif // snap_sysutils_h







>
|
>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|=============================================================================*/
#ifndef snap_sysutils_h
#define snap_sysutils_h
//---------------------------------------------------------------------------
#include "snap_platform.h"
//---------------------------------------------------------------------------
#ifdef OS_OSX
# ifndef CLOCK_MONOTONIC
#  define CLOCK_MONOTONIC 0
# endif
#endif

longword SysGetTick();
void SysSleep(longword Delay_ms);
longword DeltaTime(longword &Elapsed);

#endif // snap_sysutils_h

Added undroid/tsb/README.md.



























































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
# Taygete Scrap Book (WIP)

This is an experimental, partial, compact rebuild of some ideas
of Jupyter Notebook which first was presented at EuroTcl 2019.
The name is derived from the small retrograde irregular satellite
of Jupiter called Taygete, aka Jupiter XX.

It consists of a webview (the rendering component/library of a
web browser) with an added Tcl interface, plus some Tcl and
JavaScript to provide a user interface resembling Jupyter Notebook.
The webview part is basically taken from the Tiny cross-platform
[webview] library for C/C++/Golang with the Python interface taken
as starting point for the Tcl interface.

No browser and webserver are required so it can be made into one
binary with zero installation and without requiring network
infrastructure. Uncloudy, so to speak clean hot air.

A ready made ZIP kit for immediate experimation is available in [tsbkit].
It supports the three major desktop platforms Windows (32 and 64 bit),
MacOS (Intel, 64 bit), Linux (Intel, 32 and 64 bit, distro agnostic but
a decent version with gnome 3 runtime is required). If started without
further arguments, it presents an overview page with links to examples.

<img src="data:image/png;base64,
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">

## How does it work?

In Tcl a webview is created

    set W [twv:new -width 800 -height 600 -url ... -callback ...]

From Tcl JavaScript code can be evaluated using

    $W eval JavaScript-code-string
    $W call JavaScript-function ?string-argument...?

From JavaScript Tcl code can be evaluated using

    window.external.invoke(Tcl-callback-argument);

The bootstrap in the webview constructor is an URL which contains
JavaScript to evaluate Tcl code, which writes the skeleton of a HTML
document including the necessary JavaScript functions to interface
with the rest of the Tcl code, i.e. calls

    document.write(HTML+CSS+JavaScript-code);
    document.close();

With these means a REPL is build which initially consists of an HTML
textarea as input field plus two HTML divs for output of preformatted
text and HTML. When text is input into the textarea and <Shift-Return>
is entered, that text is evaluated as Tcl script, or HTML/Markdown.
The result is put into one of the HTML divs for output. In case the
evaluation did not produce an error, a new empty HTML textarea plus
two new HTML divs for output are added to the document, which then
are used for the next evaluation, and so on.

## And what is it good for?

Good question. At least, one can quickly, interactively check out
Tcl code and at the same time write some good looking documentation,
which can be immediately printed out (platform dependent) or written
as HTML to a file for later display in a browser.

## How to hang yourself without a rope?

The current version does not use a Tcl slave interpreter for command
evaluation (which would allow for limitation of runtime and a "safe"
set of available Tcl commands). Thus, the easiest way to hang yourself
is to enter

    while {1} {}

No measures are implemented to limit the interpreter's capabilities,
thus malicious creativity like

    exec sudo sh -c {rm -rf .*}

is possible. You have been warned!

[webview]: https://github.com/zserge/webview
[tsbkit]: http://www.ch-werner.de/AndroWish/TSB.kit

Changes to undroid/tsb/tsb.tcl.

1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
	var Wraw = function(id, str) {
	    var output = document.getElementById('out' + id + '-raw');
	    if (needsClear[id]) {
		output.innerHTML = str;
	    } else {
		output.innerHTML += str;
	    }
	    if (asciimath.AMprocessNode) {
		asciimath.AMprocessNode(output, false, null);
	    }
	    if (needsClear[id]) {
		output =
		    document.getElementById('out' + id + '-pre').firstChild;
		if (output.innerHTML.length > 0) {
		    output.style.color = 'inherit';







|







1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
	var Wraw = function(id, str) {
	    var output = document.getElementById('out' + id + '-raw');
	    if (needsClear[id]) {
		output.innerHTML = str;
	    } else {
		output.innerHTML += str;
	    }
	    if (!msLike && asciimath.AMprocessNode) {
		asciimath.AMprocessNode(output, false, null);
	    }
	    if (needsClear[id]) {
		output =
		    document.getElementById('out' + id + '-pre').firstChild;
		if (output.innerHTML.length > 0) {
		    output.style.color = 'inherit';