static int com2tcp( const char *pPath, const ComParams &comParams, const char *pIF, const char *pAddr, const char *pPort, Protocol &protocol, const BYTE *pAwakSeq) { HANDLE hC0C = OpenC0C(pPath, comParams); if (hC0C == INVALID_HANDLE_VALUE) { return 2; } while (WaitComReady(hC0C, comParams.IgnoreDSR(), pAwakSeq)) { SOCKET hSock = Connect(pIF, pAddr, pPort); if (hSock == INVALID_SOCKET) break; InOut(hC0C, hSock, protocol, comParams.IgnoreDSR()); Disconnect(hSock); } CloseHandle(hC0C); return 2; }
static int tcp2com( const char *pPath, const ComParams &comParams, const char *pIF, const char *pPort, Protocol &protocol) { SOCKET hSockListen = Socket(pIF, pPort); if (hSockListen == INVALID_SOCKET) return 2; if (listen(hSockListen, SOMAXCONN) == SOCKET_ERROR) { TraceLastError("tcp2com(): listen(\"%s\", \"%s\")", pIF, pPort); closesocket(hSockListen); return 2; } for (;;) { SOCKET hSock = Accept(hSockListen); if (hSock == INVALID_SOCKET) break; HANDLE hC0C = OpenC0C(pPath, comParams); if (hC0C != INVALID_HANDLE_VALUE) { InOut(hC0C, hSock, protocol, comParams.IgnoreDSR(), hSockListen); CloseHandle(hC0C); } Disconnect(hSock); } closesocket(hSockListen); return 2; }
/*--------------------------------------------------------------------- ---------------------------------------------------------------------*/ void ConvexIntersect( tPolygoni P, tPolygoni Q, int n, int m ) /* P has n vertices, Q has m vertices. */ { int a, b; /* indices on P and Q (resp.) */ int a1, b1; /* a-1, b-1 (resp.) */ tPointi A, B; /* directed edges on P and Q (resp.) */ int cross; /* sign of z-component of A x B */ int bHA, aHB; /* b in H(A); a in H(b). */ tPointi Origin = {0,0}; /* (0,0) */ tPointd p; /* double point of intersection */ tPointd q; /* second point of intersection */ tInFlag inflag; /* {Pin, Qin, Unknown}: which inside */ int aa, ba; /* # advances on a & b indices (after 1st inter.) */ bool FirstPoint; /* Is this the first point? (used to initialize).*/ tPointd p0; /* The first point. */ int code; /* SegSegInt return code. */ /* Initialize variables. */ a = 0; b = 0; aa = 0; ba = 0; inflag = Unknown; FirstPoint = TRUE; do { /*printf("%%Before Advances:a=%d, b=%d; aa=%d, ba=%d; inflag=%d\n", a, b, aa, ba, inflag);*/ /* Computations of key variables. */ a1 = (a + n - 1) % n; b1 = (b + m - 1) % m; SubVec( P[a], P[a1], A ); SubVec( Q[b], Q[b1], B ); cross = AreaSign( Origin, A, B ); aHB = AreaSign( Q[b1], Q[b], P[a] ); bHA = AreaSign( P[a1], P[a], Q[b] ); printf("%%cross=%d, aHB=%d, bHA=%d\n", cross, aHB, bHA ); /* If A & B intersect, update inflag. */ code = SegSegInt( P[a1], P[a], Q[b1], Q[b], p, q ); printf("%%SegSegInt: code = %c\n", code ); if ( code == '1' || code == 'v' ) { if ( inflag == Unknown && FirstPoint ) { aa = ba = 0; FirstPoint = FALSE; p0[X] = p[X]; p0[Y] = p[Y]; printf("%8.2lf %8.2lf moveto\n", p0[X], p0[Y] ); } inflag = InOut( p, inflag, aHB, bHA ); printf("%%InOut sets inflag=%d\n", inflag); } /*-----Advance rules-----*/ /* Special case: A & B overlap and oppositely oriented. */ if ( ( code == 'e' ) && (Dot( A, B ) < 0) ) PrintSharedSeg( p, q ), exit(EXIT_SUCCESS); /* Special case: A & B parallel and separated. */ if ( (cross == 0) && ( aHB < 0) && ( bHA < 0 ) ) printf("%%P and Q are disjoint.\n"), exit(EXIT_SUCCESS); /* Special case: A & B collinear. */ else if ( (cross == 0) && ( aHB == 0) && ( bHA == 0 ) ) { /* Advance but do not output point. */ if ( inflag == Pin ) b = Advance( b, &ba, m, inflag == Qin, Q[b] ); else a = Advance( a, &aa, n, inflag == Pin, P[a] ); } /* Generic cases. */ else if ( cross >= 0 ) { if ( bHA > 0) a = Advance( a, &aa, n, inflag == Pin, P[a] ); else b = Advance( b, &ba, m, inflag == Qin, Q[b] ); } else /* if ( cross < 0 ) */{ if ( aHB > 0) b = Advance( b, &ba, m, inflag == Qin, Q[b] ); else a = Advance( a, &aa, n, inflag == Pin, P[a] ); } printf("%%After advances:a=%d, b=%d; aa=%d, ba=%d; inflag=%d\n", a, b, aa, ba, inflag); /* Quit when both adv. indices have cycled, or one has cycled twice. */ } while ( ((aa < n) || (ba < m)) && (aa < 2*n) && (ba < 2*m) ); if ( !FirstPoint ) /* If at least one point output, close up. */ printf("%8.2lf %8.2lf lineto\n", p0[X], p0[Y] ); /* Deal with special cases: not implemented. */ if ( inflag == Unknown) printf("%%The boundaries of P and Q do not cross.\n"); }