/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */ /* From input file "cht-1.7.pp" */ #ifndef P2C_H #define P2C_H /* Header file for code generated by "p2c", the Pascal-to-C translator */ /* "p2c" Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation. * By Dave Gillespie, daveg@synaptics.com. Version 1.21alpha-07.Dec.93. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ #include #define DOUBLE double /* If the following heuristic fails, compile -DBSD=0 for non-BSD systems, or -DBSD=1 for BSD systems. */ #ifdef M_XENIX # define BSD 0 #endif #ifdef vms # define BSD 0 # ifndef __STDC__ # define __STDC__ 1 # endif #endif #ifdef __TURBOC__ # define MSDOS 1 #endif #ifdef MSDOS # define BSD 0 #endif #ifdef FILE /* a #define in BSD, a typedef in SYSV (hp-ux, at least) */ # ifndef BSD /* (a convenient, but horrible kludge!) */ # define BSD 1 # endif #endif #ifdef BSD # if !BSD # undef BSD # endif #endif #if (defined(__STDC__) && !defined(M_XENIX)) || defined(__TURBOC__) # include # include # define HAS_STDLIB # if defined(vms) || defined(__TURBOC__) # define NON_ANSI_CAT # endif #else # ifndef BSD # ifndef __TURBOC__ # include # endif # endif # ifdef hpux # ifdef _INCLUDE__STDC__ # include # include # define HAS_STDLIB # endif # endif # include # if !defined(MSDOS) || defined(__TURBOC__) # define NON_ANSI_CAT # endif #endif #if defined(NON_ANSI_CAT) && !defined(ANSI_CAT) # ifdef NON_ANSI_CAT_ALTERNATE # define __CAT__(a,b)a/**/b # else # define __ID__(a)a # define __CAT__(a,b)__ID__(a)b # endif #else # define __CAT__(a,b)a##b #endif #ifdef BSD # include # define memcpy(a,b,n) (bcopy(b,a,n),a) # define memcmp(a,b,n) bcmp(a,b,n) # define strchr(s,c) index(s,c) # define strrchr(s,c) rindex(s,c) #else # include #endif #include #include #include #include #ifndef NO_LACK #ifdef vms #define LACK_LABS #define LACK_MEMMOVE #define LACK_MEMCPY #else #define LACK_LABS /* Undefine these if your library has these */ #define LACK_MEMMOVE #endif #endif typedef struct __p2c_jmp_buf { struct __p2c_jmp_buf *next; jmp_buf jbuf; } __p2c_jmp_buf; /* Warning: The following will not work if setjmp is used simultaneously. This also violates the ANSI restriction about using vars after longjmp, but a typical implementation of longjmp will get it right anyway. */ #ifndef FAKE_TRY # define TRY(x) do { __p2c_jmp_buf __try_jb; \ __try_jb.next = __top_jb; \ if (!setjmp((__top_jb = &__try_jb)->jbuf)) { # define RECOVER(x) __top_jb = __try_jb.next; } else { # define RECOVER2(x,L) __top_jb = __try_jb.next; } else { \ if (0) { L: __top_jb = __try_jb.next; } # define ENDTRY(x) } } while (0) #else # define TRY(x) if (1) { # define RECOVER(x) } else do { # define RECOVER2(x,L) } else do { L: ; # define ENDTRY(x) } while (0) #endif #ifdef M_XENIX /* avoid compiler bug */ # define SHORT_MAX (32767) # define SHORT_MIN (-32768) #endif /* The following definitions work only on twos-complement machines */ #ifndef SHORT_MAX # define SHORT_MAX ((short)(((unsigned short) -1) >> 1)) # define SHORT_MIN (~SHORT_MAX) #endif #ifndef INT_MAX # define INT_MAX ((int)(((unsigned int) -1) >> 1)) # define INT_MIN (~INT_MAX) #endif #ifndef LONG_MAX # define LONG_MAX ((long)(((unsigned long) -1) >> 1)) # define LONG_MIN (~LONG_MAX) #endif #ifndef SEEK_SET # define SEEK_SET 0 # define SEEK_CUR 1 # define SEEK_END 2 #endif #ifndef EXIT_SUCCESS # ifdef vms # define EXIT_SUCCESS 1 # define EXIT_FAILURE (02000000000L) # else # define EXIT_SUCCESS 0 # define EXIT_FAILURE 1 # endif #endif #define SETBITS 32 #if defined(__STDC__) || defined(__TURBOC__) # if !defined(vms) && !defined(M_LINT) # define Signed signed # else # define Signed # endif # define Void void /* Void f() = procedure */ # ifndef Const # define Const const # endif # ifndef Volatile # define Volatile volatile # endif # ifdef M_LINT # define PP(x) () # define PV() () typedef char *Anyptr; # else # define PP(x) x /* function prototype */ # define PV() (void) /* null function prototype */ typedef void *Anyptr; # endif #else # define Signed # define Void void # ifndef Const # define Const # endif # ifndef Volatile # define Volatile # endif # define PP(x) () # define PV() () typedef char *Anyptr; #endif #ifdef __GNUC__ # define Inline inline #else # define Inline #endif #define Register register /* Register variables */ #define Char char /* Characters (not bytes) */ #ifndef Static # define Static static /* Private global funcs and vars */ #endif #ifndef Local # define Local static /* Nested functions */ #endif typedef Signed char schar; typedef unsigned char uchar; typedef unsigned char boolean; #ifndef NO_DECLARE_ALFA typedef Char alfa[10]; #endif #ifndef true # define true 1 # define false 0 #endif #ifndef TRUE # define TRUE 1 # define FALSE 0 #endif typedef struct { Anyptr proc, link; } _PROCEDURE; #ifndef _FNSIZE # define _FNSIZE 120 #endif extern Void PASCAL_MAIN PP( (int, Char **) ); extern Char **P_argv; extern int P_argc; extern short P_escapecode; extern int P_ioresult; extern __p2c_jmp_buf *__top_jb; #ifdef P2C_H_PROTO /* if you have Ansi C but non-prototyped header files */ extern Char *strcat PP( (Char *, Const Char *) ); extern Char *strchr PP( (Const Char *, int) ); extern int strcmp PP( (Const Char *, Const Char *) ); extern Char *strcpy PP( (Char *, Const Char *) ); extern size_t strlen PP( (Const Char *) ); extern Char *strncat PP( (Char *, Const Char *, size_t) ); extern int strncmp PP( (Const Char *, Const Char *, size_t) ); extern Char *strncpy PP( (Char *, Const Char *, size_t) ); extern Char *strrchr PP( (Const Char *, int) ); extern Anyptr memchr PP( (Const Anyptr, int, size_t) ); extern Anyptr memmove PP( (Anyptr, Const Anyptr, size_t) ); extern Anyptr memset PP( (Anyptr, int, size_t) ); #ifndef memcpy extern Anyptr memcpy PP( (Anyptr, Const Anyptr, size_t) ); extern int memcmp PP( (Const Anyptr, Const Anyptr, size_t) ); #endif extern int atoi PP( (Const Char *) ); extern double atof PP( (Const Char *) ); extern long atol PP( (Const Char *) ); extern double strtod PP( (Const Char *, Char **) ); extern long strtol PP( (Const Char *, Char **, int) ); #endif /*P2C_H_PROTO*/ #ifndef HAS_STDLIB #ifndef NO_DECLARE_MALLOC extern Anyptr malloc PP( (size_t) ); extern Void free PP( (Anyptr) ); #endif #endif extern int _OutMem PV(); extern int _CaseCheck PV(); extern int _NilCheck PV(); extern int _Escape PP( (int) ); extern int _EscIO PP( (int) ); extern int _EscIO2 PP( (int, Char *) ); extern long ipow PP( (long, long) ); extern long P_imax PP( (long, long) ); extern long P_imin PP( (long, long) ); extern double P_rmax PP( (double, double) ); extern double P_rmin PP( (double, double) ); extern Char *strsub PP( (Char *, Char *, int, int) ); extern Char *strltrim PP( (Char *) ); extern Char *strrtrim PP( (Char *) ); extern Char *strrpt PP( (Char *, Char *, int) ); extern Char *strpad PP( (Char *, Char *, int, int) ); extern int strpos2 PP( (Char *, Char *, int) ); extern long memavail PV(); extern int P_peek PP( (FILE *) ); extern int P_eof PP( (FILE *) ); extern int P_eoln PP( (FILE *) ); extern Void P_readpaoc PP( (FILE *, Char *, int) ); extern Void P_readlnpaoc PP( (FILE *, Char *, int) ); extern long P_maxpos PP( (FILE *) ); extern Char *P_trimname PP( (Char *, int) ); extern long *P_setunion PP( (long *, long *, long *) ); extern long *P_setint PP( (long *, long *, long *) ); extern long *P_setdiff PP( (long *, long *, long *) ); extern long *P_setxor PP( (long *, long *, long *) ); extern int P_inset PP( (unsigned, long *) ); extern int P_setequal PP( (long *, long *) ); extern int P_subset PP( (long *, long *) ); extern long *P_addset PP( (long *, unsigned) ); extern long *P_addsetr PP( (long *, unsigned, unsigned) ); extern long *P_remset PP( (long *, unsigned) ); extern long *P_setcpy PP( (long *, long *) ); extern long *P_expset PP( (long *, long) ); extern long P_packset PP( (long *) ); extern int P_getcmdline PP( (int, int, Char *) ); extern Void TimeStamp PP( (int *, int *, int *, int *, int *, int *) ); extern Void P_sun_argv PP( (char *, int, int) ); extern FILE *_skipspaces PP( (FILE *) ); extern FILE *_skipnlspaces PP( (FILE *) ); /* I/O error handling */ #define _CHKIO(cond,ior,val,def) ((cond) ? P_ioresult=0,(val) \ : P_ioresult=(ior),(def)) #define _SETIO(cond,ior) (P_ioresult = (cond) ? 0 : (ior)) /* Following defines are suitable for the HP Pascal operating system */ #define FileNotFound 10 #define FileNotOpen 13 #define FileWriteError 38 #define BadInputFormat 14 #define EndOfFile 30 #define FILENOTFOUND 10 #define FILENOTOPEN 13 #define FILEWRITEERROR 38 #define BADINPUTFORMAT 14 #define ENDOFFILE 30 /* Creating temporary files */ #if (defined(BSD) || defined(NO_TMPFILE)) && !defined(HAVE_TMPFILE) # define tmpfile() (fopen(tmpnam(NULL), "w+")) #endif /* File buffers */ #define FILEBUF(f,sc,type) sc int __CAT__(f,_BFLAGS); \ sc type __CAT__(f,_BUFFER) #define FILEBUFNC(f,type) int __CAT__(f,_BFLAGS); \ type __CAT__(f,_BUFFER) #define RESETBUF(f,type) (__CAT__(f,_BFLAGS) = 1) #define SETUPBUF(f,type) (__CAT__(f,_BFLAGS) = 0) #define GETFBUF(f,type) (*((__CAT__(f,_BFLAGS) == 1 && \ ((__CAT__(f,_BFLAGS) = 2), \ fread(&__CAT__(f,_BUFFER), \ sizeof(type),1,(f)))),\ &__CAT__(f,_BUFFER))) #define AGETFBUF(f,type) ((__CAT__(f,_BFLAGS) == 1 && \ ((__CAT__(f,_BFLAGS) = 2), \ fread(__CAT__(f,_BUFFER), \ sizeof(type),1,(f)))),\ __CAT__(f,_BUFFER)) #define PUTFBUF(f,type,v) (GETFBUF(f,type) = (v)) #define CPUTFBUF(f,v) (PUTFBUF(f,char,v)) #define APUTFBUF(f,type,v) (memcpy(AGETFBUF(f,type), (v), \ sizeof(__CAT__(f,_BUFFER)))) #define GET(f,type) (__CAT__(f,_BFLAGS) == 1 ? \ fread(&__CAT__(f,_BUFFER),sizeof(type),1,(f)) : \ (__CAT__(f,_BFLAGS) = 1)) #define PUT(f,type) (fwrite(&__CAT__(f,_BUFFER),sizeof(type),1,(f)), \ (__CAT__(f,_BFLAGS) = 0)) #define CPUT(f) (PUT(f,char)) #define BUFEOF(f) (__CAT__(f,_BFLAGS) != 2 && P_eof(f)) #define BUFFPOS(f) (ftell(f) - (__CAT__(f,_BFLAGS) == 2)) typedef struct { FILE *f; int f_BFLAGS; /* FILEBUFNC(f,Char); */ Char f_BUFFER; Char name[_FNSIZE]; } _TEXT; /* Memory allocation */ #ifdef __GCC__ # define Malloc(n) (malloc(n) ?: (Anyptr)_OutMem()) #else extern Anyptr __MallocTemp__; # define Malloc(n) ((__MallocTemp__ = malloc(n)) ? __MallocTemp__ : (Anyptr)_OutMem()) #endif #define FreeR(p) (free((Anyptr)(p))) /* used if arg is an rvalue */ #define Free(p) (free((Anyptr)(p)), (p)=NULL) /* sign extension */ #define SEXT(x,n) ((x) | -(((x) & (1L<<((n)-1))) << 1)) /* packed arrays */ /* BEWARE: these are untested! */ #define P_getbits_UB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] >> \ (((~(i))&((1<<(L)-(n))-1)) << (n)) & \ (1<<(1<<(n)))-1)) #define P_getbits_SB(a,i,n,L) ((int)((a)[(i)>>(L)-(n)] << \ (16 - ((((~(i))&((1<<(L)-(n))-1))+1) <<\ (n)) >> (16-(1<<(n)))))) #define P_putbits_UB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \ (x) << (((~(i))&((1<<(L)-(n))-1)) << (n))) #define P_putbits_SB(a,i,x,n,L) ((a)[(i)>>(L)-(n)] |= \ ((x) & (1<<(1<<(n)))-1) << \ (((~(i))&((1<<(L)-(n))-1)) << (n))) #define P_clrbits_B(a,i,n,L) ((a)[(i)>>(L)-(n)] &= \ ~( ((1<<(1<<(n)))-1) << \ (((~(i))&((1<<(L)-(n))-1)) << (n))) ) /* small packed arrays */ #define P_getbits_US(v,i,n) ((int)((v) >> ((i)<<(n)) & (1<<(1<<(n)))-1)) #define P_getbits_SS(v,i,n) ((int)((long)(v) << (SETBITS - (((i)+1) << (n))) >> (SETBITS-(1<<(n))))) #define P_putbits_US(v,i,x,n) ((v) |= (x) << ((i) << (n))) #define P_putbits_SS(v,i,x,n) ((v) |= ((x) & (1<<(1<<(n)))-1) << ((i)<<(n))) #define P_clrbits_S(v,i,n) ((v) &= ~( ((1<<(1<<(n)))-1) << ((i)<<(n)) )) #define P_max(a,b) ((a) > (b) ? (a) : (b)) #define P_min(a,b) ((a) < (b) ? (a) : (b)) /* Fix ANSI-isms */ #ifdef LACK_LABS # ifndef labs # define labs my_labs extern long my_labs PP( (long) ); # endif #endif #ifdef LACK_MEMMOVE # ifndef memmove # define memmove my_memmove extern Anyptr my_memmove PP( (Anyptr, Const Anyptr, size_t) ); # endif #endif #ifdef LACK_MEMCPY # ifndef memcpy # define memcpy my_memcpy extern Anyptr my_memcpy PP( (Anyptr, Const Anyptr, size_t) ); # endif # ifndef memcmp # define memcmp my_memcmp extern int my_memcmp PP( (Const Anyptr, Const Anyptr, size_t) ); # endif # ifndef memset # define memset my_memset extern Anyptr my_memset PP( (Anyptr, int, size_t) ); # endif #endif /* Fix toupper/tolower on Suns and other stupid BSD systems */ #ifdef toupper # undef toupper # undef tolower # define toupper(c) my_toupper(c) # define tolower(c) my_tolower(c) #endif #ifndef _toupper # if 'A' == 65 && 'a' == 97 # define _toupper(c) ((c)-'a'+'A') # define _tolower(c) ((c)-'A'+'a') # else # ifdef toupper # undef toupper /* hope these are shadowing real functions, */ # undef tolower /* because my_toupper calls _toupper! */ # endif # define _toupper(c) toupper(c) # define _tolower(c) tolower(c) # endif #endif #endif /* P2C_H */ /* End. */ /* Run-time library for use with "p2c", the Pascal to C translator */ /* "p2c" Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation. * By Dave Gillespie, daveg@synaptics.com. Version --VERSION--. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ #ifndef NO_TIME # include #endif #define Isspace(c) isspace(c) /* or "((c) == ' ')" if preferred */ int P_argc; char **P_argv; short P_escapecode; int P_ioresult; long EXCP_LINE; /* Used by Pascal workstation system */ Anyptr __MallocTemp__; __p2c_jmp_buf *__top_jb; void PASCAL_MAIN(argc, argv) int argc; char **argv; { P_argc = argc; P_argv = argv; __top_jb = NULL; #ifdef LOCAL_INIT LOCAL_INIT(); #endif } /* In case your system lacks these... */ long my_labs(x) long x; { return((x > 0) ? x : -x); } #ifdef __STDC__ Anyptr my_memmove(Anyptr d, Const Anyptr s, size_t n) #else Anyptr my_memmove(d, s, n) Anyptr d, s; register int n; #endif { register char *dd = (char *)d, *ss = (char *)s; if (dd < ss || dd - ss >= n) { #if defined(bcopy) && defined(memcpy) my_memcpy(dd, ss, n); #else memcpy(dd, ss, n); #endif } else if (n > 0) { dd += n; ss += n; while (n-- > 0) *--dd = *--ss; } return d; } #ifdef __STDC__ Anyptr my_memcpy(Anyptr d, Const Anyptr s, size_t n) #else Anyptr my_memcpy(d, s, n) Anyptr d, s; register int n; #endif { register char *ss = (char *)s, *dd = (char *)d; while (n-- > 0) *dd++ = *ss++; return d; } #ifdef __STDC__ int my_memcmp(Const Anyptr s1, Const Anyptr s2, size_t n) #else int my_memcmp(s1, s2, n) Anyptr s1, s2; register int n; #endif { register char *a = (char *)s1, *b = (char *)s2; register int i; while (n-- > 0) if ((i = (*a++) - (*b++)) != 0) return i; return 0; } #ifdef __STDC__ Anyptr my_memset(Anyptr d, int c, size_t n) #else Anyptr my_memset(d, c, n) Anyptr d; register int c; register int n; #endif { register char *dd = (char *)d; while (n-- > 0) *dd++ = c; return d; } int my_toupper(c) int c; { if (islower(c)) return _toupper(c); else return c; } int my_tolower(c) int c; { if (isupper(c)) return _tolower(c); else return c; } long ipow(a, b) long a, b; { long v; if (a == 0 || a == 1) return a; if (a == -1) return (b & 1) ? -1 : 1; if (b < 0) return 0; if (a == 2) return 1L << b; v = (b & 1) ? a : 1; while ((b >>= 1) > 0) { a *= a; if (b & 1) v *= a; } return v; } long P_imax(a, b) long a, b; { if (a > b) return a; else return b; } long P_imin(a, b) long a, b; { if (a < b) return a; else return b; } double P_rmax(a, b) double a, b; { if (a > b) return a; else return b; } double P_rmin(a, b) double a, b; { if (a < b) return a; else return b; } /* Common string functions: */ /* Store in "ret" the substring of length "len" starting from "pos" (1-based). Store a shorter or null string if out-of-range. Return "ret". */ char *strsub(ret, s, pos, len) register char *ret, *s; register int pos, len; { register char *s2; if (--pos < 0 || len <= 0) { *ret = 0; return ret; } while (pos > 0) { if (!*s++) { *ret = 0; return ret; } pos--; } s2 = ret; while (--len >= 0) { if (!(*s2++ = *s++)) return ret; } *s2 = 0; return ret; } /* Return the index of the first occurrence of "pat" as a substring of "s", starting at index "pos" (1-based). Result is 1-based, 0 if not found. */ int strpos2(s, pat, pos) char *s; register char *pat; register int pos; { register char *cp, ch; register int slen; if (--pos < 0) return 0; slen = strlen(s) - pos; cp = s + pos; if (!(ch = *pat++)) return 0; pos = strlen(pat); slen -= pos; while (--slen >= 0) { if (*cp++ == ch && !strncmp(cp, pat, pos)) return cp - s; } return 0; } /* Case-insensitive version of strcmp. */ int strcicmp(s1, s2) register char *s1, *s2; { register unsigned char c1, c2; while (*s1) { if (*s1++ != *s2++) { if (!s2[-1]) return 1; c1 = toupper(s1[-1]); c2 = toupper(s2[-1]); if (c1 != c2) return c1 - c2; } } if (*s2) return -1; return 0; } /* HP and Turbo Pascal string functions: */ /* Trim blanks at left end of string. */ char *strltrim(s) register char *s; { while (Isspace(*s++)) ; return s - 1; } /* Trim blanks at right end of string. */ char *strrtrim(s) register char *s; { register char *s2 = s; if (!*s) return s; while (*++s2) ; while (s2 > s && Isspace(*--s2)) *s2 = 0; return s; } /* Store in "ret" "num" copies of string "s". Return "ret". */ char *strrpt(ret, s, num) char *ret; register char *s; register int num; { register char *s2 = ret; register char *s1; while (--num >= 0) { s1 = s; while ((*s2++ = *s1++)) ; s2--; } return ret; } /* Store in "ret" string "s" with enough pad chars added to reach "size". */ char *strpad(ret, s, padchar, num) char *ret; register char *s; register int padchar, num; { register char *d = ret; if (s == d) { while (*d++) ; } else { while ((*d++ = *s++)) ; } num -= (--d - ret); while (--num >= 0) *d++ = padchar; *d = 0; return ret; } /* Copy the substring of length "len" from index "spos" of "s" (1-based) to index "dpos" of "d", lengthening "d" if necessary. Length and indices must be in-range. */ void strmove(len, s, spos, d, dpos) register char *s, *d; register int len, spos, dpos; { s += spos - 1; d += dpos - 1; while (*d && --len >= 0) *d++ = *s++; if (len > 0) { while (--len >= 0) *d++ = *s++; *d = 0; } } /* Delete the substring of length "len" at index "pos" from "s". Delete less if out-of-range. */ void strdelete(s, pos, len) register char *s; register int pos, len; { register int slen; if (--pos < 0) return; slen = strlen(s) - pos; if (slen <= 0) return; s += pos; if (slen <= len) { *s = 0; return; } while ((*s = s[len])) s++; } /* Insert string "src" at index "pos" of "dst". */ void strinsert(src, dst, pos) register char *src, *dst; register int pos; { register int slen, dlen; if (--pos < 0) return; dlen = strlen(dst); dst += dlen; dlen -= pos; if (dlen <= 0) { strcpy(dst, src); return; } slen = strlen(src); do { dst[slen] = *dst; --dst; } while (--dlen >= 0); dst++; while (--slen >= 0) *dst++ = *src++; } /* File functions */ /* Peek at next character of input stream; return EOF at end-of-file. */ int P_peek(f) FILE *f; { int ch; ch = getc(f); if (ch == EOF) return EOF; ungetc(ch, f); return (ch == '\n') ? ' ' : ch; } /* Check if at end of file, using Pascal "eof" semantics. End-of-file for stdin is broken; remove the special case for it to be broken in a different way. */ int P_eof(f) FILE *f; { register int ch; if (feof(f)) return 1; #ifdef HAVE_ISATTY if (isatty(fileno(f))) #else if (f == stdin) #endif return 0; /* not safe to look-ahead on the keyboard! */ ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return 0; } /* Check if at end of line (or end of entire file). */ int P_eoln(f) FILE *f; { register int ch; ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return (ch == '\n'); } /* Skip whitespace (including newlines) in a file. */ FILE *_skipnlspaces(f) FILE *f; { register int ch; do { ch = getc(f); } while (ch == ' ' || ch == '\t' || ch == '\n'); if (ch != EOF) ungetc(ch, f); return f; } /* Skip whitespace (not including newlines) in a file. */ FILE *_skipspaces(f) FILE *f; { register int ch; do { ch = getc(f); } while (ch == ' ' || ch == '\t'); if (ch != EOF) ungetc(ch, f); return f; } /* Read a packed array of characters from a file. */ Void P_readpaoc(f, s, len) FILE *f; char *s; int len; { int ch; for (;;) { if (len <= 0) return; ch = getc(f); if (ch == EOF || ch == '\n') break; *s++ = ch; --len; } while (--len >= 0) *s++ = ' '; if (ch != EOF) ungetc(ch, f); } Void P_readlnpaoc(f, s, len) FILE *f; char *s; int len; { int ch; for (;;) { ch = getc(f); if (ch == EOF || ch == '\n') break; if (len > 0) { *s++ = ch; --len; } } while (--len >= 0) *s++ = ' '; } /* Compute maximum legal "seek" index in file (0-based). */ long P_maxpos(f) FILE *f; { long savepos = ftell(f); long val; if (fseek(f, 0L, SEEK_END)) return -1; val = ftell(f); if (fseek(f, savepos, SEEK_SET)) return -1; return val; } /* Use packed array of char for a file name. */ Char *P_trimname(fn, len) register Char *fn; register int len; { static Char fnbuf[256]; register Char *cp = fnbuf; while (--len >= 0 && *fn && !isspace(*fn)) *cp++ = *fn++; *cp = 0; return fnbuf; } /* Pascal's "memavail" doesn't make much sense in Unix with virtual memory. We fix memory size as 10Meg as a reasonable compromise. */ long memavail() { return 10000000; /* worry about this later! */ } long maxavail() { return memavail(); } /* Sets are stored as an array of longs. S[0] is the size of the set; S[N] is the N'th 32-bit chunk of the set. S[0] equals the maximum I such that S[I] is nonzero. S[0] is zero for an empty set. Within each long, bits are packed from lsb to msb. The first bit of the set is the element with ordinal value 0. (Thus, for a "set of 5..99", the lowest five bits of the first long are unused and always zero.) */ /* (Sets with 32 or fewer elements are normally stored as plain longs.) */ long *P_setunion(d, s1, s2) /* d := s1 + s2 */ register long *d, *s1, *s2; { long *dbase = d++; register int sz1 = *s1++, sz2 = *s2++; while (sz1 > 0 && sz2 > 0) { *d++ = *s1++ | *s2++; sz1--, sz2--; } while (--sz1 >= 0) *d++ = *s1++; while (--sz2 >= 0) *d++ = *s2++; *dbase = d - dbase - 1; return dbase; } long *P_setint(d, s1, s2) /* d := s1 * s2 */ register long *d, *s1, *s2; { long *dbase = d++; register int sz1 = *s1++, sz2 = *s2++; while (--sz1 >= 0 && --sz2 >= 0) *d++ = *s1++ & *s2++; while (--d > dbase && !*d) ; *dbase = d - dbase; return dbase; } long *P_setdiff(d, s1, s2) /* d := s1 - s2 */ register long *d, *s1, *s2; { long *dbase = d++; register int sz1 = *s1++, sz2 = *s2++; while (--sz1 >= 0 && --sz2 >= 0) *d++ = *s1++ & ~*s2++; if (sz1 >= 0) { while (sz1-- >= 0) *d++ = *s1++; } while (--d > dbase && !*d) ; *dbase = d - dbase; return dbase; } long *P_setxor(d, s1, s2) /* d := s1 / s2 */ register long *d, *s1, *s2; { long *dbase = d++; register int sz1 = *s1++, sz2 = *s2++; while (sz1 > 0 && sz2 > 0) { *d++ = *s1++ ^ *s2++; sz1--, sz2--; } while (--sz1 >= 0) *d++ = *s1++; while (--sz2 >= 0) *d++ = *s2++; while (--d > dbase && !*d) ; *dbase = d - dbase; return dbase; } int P_inset(val, s) /* val IN s */ register unsigned val; register long *s; { register int bit; bit = val % SETBITS; val /= SETBITS; if (val < *s++ && ((1L< size) { s += size; while (val > size) *++s = 0, size++; *sbase = size; } else s += val; *s |= 1L< (int)v2) return sbase; b1 = v1 % SETBITS; v1 /= SETBITS; b2 = v2 % SETBITS; v2 /= SETBITS; size = *s; v1++; if (++v2 > size) { while (v2 > size) s[++size] = 0; s[v2] = 0; *s = v2; } s += v1; if (v1 == v2) { *s |= (~((-2L)<<(b2-b1))) << b1; } else { *s++ |= (-1L) << b1; while (++v1 < v2) *s++ = -1; *s |= ~((-2L) << b2); } return sbase; } long *P_remset(s, val) /* s := s - [val] */ register long *s; register unsigned val; { register int bit; bit = val % SETBITS; val /= SETBITS; if (++val <= *s) { if (!(s[val] &= ~(1L<= 0) { if (*s1++ != *s2++) return 0; } return 1; } int P_subset(s1, s2) /* s1 <= s2 */ register long *s1, *s2; { register int sz1 = *s1++, sz2 = *s2++; if (sz1 > sz2) return 0; while (--sz1 >= 0) { if (*s1++ & ~*s2++) return 0; } return 1; } long *P_setcpy(d, s) /* d := s */ register long *d, *s; { register long *save_d = d; #ifdef SETCPY_MEMCPY memcpy(d, s, (*s + 1) * sizeof(long)); #else register int i = *s + 1; while (--i >= 0) *d++ = *s++; #endif return save_d; } /* s is a "smallset", i.e., a 32-bit or less set stored directly in a long. */ long *P_expset(d, s) /* d := s */ register long *d; register long s; { if (s) { d[1] = s; *d = 1; } else *d = 0; return d; } long P_packset(s) /* convert s to a small-set */ register long *s; { if (*s++) return *s; else return 0; } /* Oregon Software Pascal extensions, courtesy of William Bader */ int P_getcmdline(l, h, line) int l, h; Char *line; { int i, len; char *s; h = h - l + 1; len = 0; for(i = 1; i < P_argc; i++) { s = P_argv[i]; while (*s) { if (len >= h) return len; line[len++] = *s++; } if (len >= h) return len; line[len++] = ' '; } return len; } Void TimeStamp(Day, Month, Year, Hour, Min, Sec) int *Day, *Month, *Year, *Hour, *Min, *Sec; { #ifndef NO_TIME struct tm *tm; long clock; time(&clock); tm = localtime(&clock); *Day = tm->tm_mday; *Month = tm->tm_mon + 1; /* Jan = 0 */ *Year = tm->tm_year; if (*Year < 1900) *Year += 1900; /* year since 1900 */ *Hour = tm->tm_hour; *Min = tm->tm_min; *Sec = tm->tm_sec; #endif } Void VAXdate(s) char *s; { long clock; char *c; int i; static int where[] = {8, 9, 0, 4, 5, 6, 0, 20, 21, 22, 23}; time(&clock); c = ctime(&clock); for (i = 0; i < 11; i++) s[i] = my_toupper(c[where[i]]); s[2] = '-'; s[6] = '-'; } Void VAXtime(s) char *s; { long clock; char *c; int i; time(&clock); c = ctime(&clock); for (i = 0; i < 8; i++) s[i] = c[i+11]; s[8] = '.'; s[9] = '0'; s[10] = '0'; } /* SUN Berkeley Pascal extensions */ Void P_sun_argv(s, len, n) register char *s; register int len, n; { register char *cp; if ((unsigned)n < P_argc) cp = P_argv[n]; else cp = ""; while (*cp && --len >= 0) *s++ = *cp++; while (--len >= 0) *s++ = ' '; } int _OutMem() { return _Escape(-2); } int _CaseCheck() { return _Escape(-9); } int _NilCheck() { return _Escape(-3); } /* The following is suitable for the HP Pascal operating system. It might want to be revised when emulating another system. */ char *_ShowEscape(buf, code, ior, prefix) char *buf, *prefix; int code, ior; { char *bufp; if (prefix && *prefix) { strcpy(buf, prefix); strcat(buf, ": "); bufp = buf + strlen(buf); } else { bufp = buf; } if (code == -10) { sprintf(bufp, "Pascal system I/O error %d", ior); switch (ior) { case 3: strcat(buf, " (illegal I/O request)"); break; case 7: strcat(buf, " (bad file name)"); break; case FileNotFound: /*10*/ strcat(buf, " (file not found)"); break; case FileNotOpen: /*13*/ strcat(buf, " (file not open)"); break; case BadInputFormat: /*14*/ strcat(buf, " (bad input format)"); break; case 24: strcat(buf, " (not open for reading)"); break; case 25: strcat(buf, " (not open for writing)"); break; case 26: strcat(buf, " (not open for direct access)"); break; case 28: strcat(buf, " (string subscript out of range)"); break; case EndOfFile: /*30*/ strcat(buf, " (end-of-file)"); break; case FileWriteError: /*38*/ strcat(buf, " (file write error)"); break; } } else { sprintf(bufp, "Pascal system error %d", code); switch (code) { case -2: strcat(buf, " (out of memory)"); break; case -3: strcat(buf, " (reference to NIL pointer)"); break; case -4: strcat(buf, " (integer overflow)"); break; case -5: strcat(buf, " (divide by zero)"); break; case -6: strcat(buf, " (real math overflow)"); break; case -8: strcat(buf, " (value range error)"); break; case -9: strcat(buf, " (CASE value range error)"); break; case -12: strcat(buf, " (bus error)"); break; case -20: strcat(buf, " (stopped by user)"); break; } } return buf; } int _Escape(code) int code; { char buf[100]; P_escapecode = code; if (__top_jb) { __p2c_jmp_buf *jb = __top_jb; __top_jb = jb->next; longjmp(jb->jbuf, 1); } if (code == 0) exit(EXIT_SUCCESS); if (code == -1) exit(EXIT_FAILURE); fprintf(stderr, "%s\n", _ShowEscape(buf, P_escapecode, P_ioresult, "")); exit(EXIT_FAILURE); } int _EscIO(code) int code; { P_ioresult = code; return _Escape(-10); } int _EscIO2(code, name) int code; char *name; { P_ioresult = code; if (!__top_jb && name && *name) { char buf[100]; fprintf(stderr, "%s: %s\n", name, _ShowEscape(buf, P_escapecode, P_ioresult, "")); exit(EXIT_FAILURE); } return _Escape(-10); } /* End. */ typedef struct TPoint { long X, Y, C, H, N, O, P, S, Si, B, Br, Cl, F, I, Mg, Na, K, RecCount; struct TPoint *Last; } TPoint; typedef struct TBond { long X1, Y1, X2, Y2, RecCount; struct TBond *Last; } TBond; Static long C, H, N, O, P, S, Si, B, Br, Cl, F, I, Mg, Na, K, X1, X2, Y1, Y2, T; Static FILE *IFile; Static TPoint *Point, *Last, *Current; Static TBond *Bond, *LastB, *CurrentB; Static Char sss[256], A[256], subs[256], Alert[256]; Static Char sssb[7]; Static double M, Me; Static Char separator; Static long Count, code, atoms, rep, range, bonds; Static boolean Abandon, debug, verbose, fa, nobonds; Static long Sensi = 5; /*bonds and labels joint precision sensitivity*/ Static Char IFile_NAME[_FNSIZE]; Static Void doBonds() { do { fscanf(IFile, "%ld%ld%ld%ld%ld%*[^\n]", &X1, &Y1, &X2, &Y2, &T); getc(IFile); bonds--; if (debug) printf("%ld; %ld; %ld; %ld; %ld\n", X1, Y1, X2, Y2, T); if (T == 11) range = ((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2)) * 4; LastB = Bond; Bond = (TBond *)Malloc(sizeof(TBond)); Bond->X1 = X1; Bond->X2 = X2; Bond->Y1 = Y1; Bond->Y2 = Y2; Bond->Last = LastB; CurrentB = Bond; Bond = Bond->Last; while (Bond->Last != NULL) { if ((labs(Bond->X1 - X1) < Sensi && labs(Bond->Y1 - Y1) < Sensi && labs(Bond->X2 - X2) < Sensi && labs(Bond->Y2 - Y2) < Sensi) || (labs(Bond->X2 - X1) < Sensi && labs(Bond->Y2 - Y1) < Sensi && labs(Bond->X1 - X2) < Sensi && labs(Bond->Y1 - Y2) < Sensi)) { if (debug) printf(" ! Bond overlap\n"); strcat(Alert, "!"); } Bond = Bond->Last; } Bond = CurrentB; Abandon = false; Current = Point; while (Point->Last != NULL) { if (T == 11) { Abandon = true; if ((Point->X - X1) * (Point->X - X1) + (Point->Y - Y1) * (Point->Y - Y1) < range) { if (Point->H > 0) Point->H--; if (debug) printf("Ring --> stripped one H from %ld %ld\n", Point->X, Point->Y); } } else { if (labs(Point->X - X1) < Sensi && labs(Point->Y - Y1) < Sensi) { if (debug) printf(" %ld --> Joined at %ld %ld\n", Point->RecCount, X1, Y1); if (T == 0 || T == 5 || T == 6 || T == 7 || T == 10 || T == 12 || T == 13) Point->H--; if (T == 1 || T == 2 || T == 4 || T == 14 || T == 15 ) Point->H -= 2; if (T == 3) Point->H -= 3; if (Point->H < 0) { if (debug) printf("Point^.X=%ld, Point^.Y=%ld has H count <0 !\n",Point->X,Point->Y); Point->H = 0; } Abandon = true; } } Point = Point->Last; } Point = Current; if (!Abandon) { Count++; Last = Point; Point = (TPoint *)Malloc(sizeof(TPoint)); Point->X = X1; if (debug) printf(" Point^.X=%ld", Point->X); Point->Y = Y1; if (debug) printf(" Point^.Y=%ld", Point->Y); if (T != 11) Point->C = 1; else Point->C = 0; if (debug) printf(" Point^.C=%ld", Point->C); if (T == 0 || T == 5 || T == 6 || T == 7 || T == 10 || T == 12 || T == 13) Point->H = 3; if (T == 1 || T == 2 || T == 4 || T == 14 || T == 15) Point->H = 2; if (T == 3) Point->H = 1; if (debug) printf(" Point^.H=%ld", Point->H); Point->N = 0; Point->O = 0; Point->P = 0; Point->S = 0; Point->Si = 0; Point->B = 0; Point->Br = 0; Point->Cl = 0; Point->F = 0; Point->I = 0; Point->Na = 0; Point->Mg = 0; Point->K = 0; Point->RecCount = Count; if (debug) printf(" Point^.RecCount=%ld\n", Point->RecCount); Point->Last = Last; } if (T != 11) { Abandon = false; Current = Point; while (Point->Last != NULL) { if (labs(Point->X - X2) < Sensi && labs(Point->Y - Y2) < Sensi) { if (debug) printf(" %ld --> Joined at %ld %ld\n", Point->RecCount, X2, Y2); if (T == 0 || T == 5 || T == 6 || T == 7 || T == 10 || T == 12 || T == 13) Point->H--; if (T == 1 || T == 2 || T == 4 || T == 14 || T == 15) Point->H -= 2; if (T == 3) Point->H -= 3; if (Point->H < 0) { if (debug) printf("Point^.X=%ld, Point^.Y=%ld has H count <0 !\n",Point->X,Point->Y); Point->H = 0; } Abandon = true; } Point = Point->Last; } Point = Current; if (!Abandon) { Count++; Last = Point; Point = (TPoint *)Malloc(sizeof(TPoint)); Point->X = X2; if (debug) printf(" Point^.X=%ld", Point->X); Point->Y = Y2; if (debug) printf(" Point^.Y=%ld", Point->Y); if (T != 11) Point->C = 1; else Point->C = 0; if (debug) printf(" Point^.C=%ld", Point->C); if (T == 0 || T == 5 || T == 6 || T == 7 || T == 10 || T == 12 || T == 13) Point->H = 3; if (T == 1 || T == 2 || T == 4 || T == 14 || T == 15 ) Point->H = 2; if (T == 3) Point->H = 1; if (debug) printf(" Point^.H=%ld", Point->H); Point->N = 0; Point->O = 0; Point->P = 0; Point->S = 0; Point->Si = 0; Point->B = 0; Point->Br = 0; Point->Cl = 0; Point->F = 0; Point->I = 0; Point->Mg = 0; Point->Na = 0; Point->K = 0; Point->RecCount = Count; if (debug) printf(" Point^.RecCount=%ld\n", Point->RecCount); Point->Last = Last; } } } while (bonds != 0); } Static Void doLabels() { long mul, gmul, gmpos, ggmul, ggmpos; boolean stripped; Char STR2[256]; long FORLIM; Char *TEMP; if (debug) printf("---- and now parse the labels ---------\n"); if (verbose) printf("HeteroAtoms: %ld\n", atoms); FORLIM = atoms; for (rep = 1; rep <= FORLIM; rep++) { fscanf(IFile, "%ld%ld%c", &X1, &Y1, &separator); fgets(sss, 256, IFile); TEMP = strchr(sss, '\n'); if (TEMP != NULL) *TEMP = 0; sprintf(A, "%.*s", strpos2(sss, "\t", 1) - 1, sss); if (debug) printf("Atom %s X=%ld Y=%ld sss: %s\n", A, X1, Y1, sss); if (nobonds) { /*initialize the Point structure if no bonds, only labels, defined*/ Count++; Last = Point; Point = (TPoint *)Malloc(sizeof(TPoint)); Point->X = X1; Point->Y = Y1; Point->C = 0; Point->H = 0; Point->N = 0; Point->O = 0; Point->P = 0; Point->S = 0; Point->Si = 0; Point->B = 0; Point->Br = 0; Point->Cl = 0; Point->F = 0; Point->I = 0; Point->Mg = 0; Point->Na = 0; Point->K = 0; Point->RecCount = Count; Point->Last = Last; } Current = Point; while (Point->Last != NULL) { if (labs(Point->X - X1) < Sensi && labs(Point->Y - Y1) < Sensi) { if (debug) printf(" [%ld]\n", Point->RecCount); Point->C = 0; /*we substitute -CH_x(-) by -R(-)*/ Point->H = 0; Point->N = 0; Point->O = 0; Point->P = 0; Point->S = 0; Point->Si = 0; Point->B = 0; Point->Br = 0; Point->Cl = 0; Point->F = 0; Point->I = 0; Point->Mg = 0; Point->Na = 0; Point->K = 0; mul = 1; gmul = 1; ggmul = 1; while (*A != '\0') { stripped = false; if (strlen(A) >= 5) { sprintf(subs, "%.5s", A); if (strlen(A) > 6) { if (A[5] == '_') { sprintf(STR2, "%c", A[6]); code = (sscanf(STR2, "%ld", &mul) == 0); } else mul = 1; } mul *= gmul * ggmul; if (!strcmp(subs, "TBDMS")) { /*Tert-butyldimethylsilyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 6; Point->H += mul * 15; Point->Si += mul; strcpy(A, strsub(STR2, A, 6, (int)(strlen(A) - 5))); stripped = true; } if (!strcmp(subs, "TBDPS")) { /*Tert-butyldiphenylsilyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 16; Point->H += mul * 19; Point->Si += mul; strcpy(A, strsub(STR2, A, 6, (int)(strlen(A) - 5))); stripped = true; } if (A[0] == '[') { ggmpos = strpos2(A, "]", 1); if (ggmpos != 0) { if (A[ggmpos] == '_') { sprintf(STR2, "%c", A[ggmpos+1]); code = (sscanf(STR2, "%ld", &ggmul) == 0); } else ggmul = 1; } } if (A[0] == '(') { gmpos = strpos2(A, ")", 1); if (gmpos != 0) { if (A[gmpos] == '_') { sprintf(STR2, "%c", A[gmpos+1]); code = (sscanf(STR2, "%ld", &gmul) == 0); } else gmul = 1; } } } if (strlen(A) >= 4 && !stripped) { sprintf(subs, "%.4s", A); if (strlen(A) > 5) { if (A[4] == '_') { sprintf(STR2, "%c", A[5]); code = (sscanf(STR2, "%ld", &mul) == 0); } else mul = 1; } mul *= gmul * ggmul; if (!strcmp(subs, "DBAM")) { /*dibutylaminomethylene; =R, used as the N prot.*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 9; Point->H += mul * 19; Point->N += mul; strcpy(A, strsub(STR2, A, 5, (int)(strlen(A) - 4))); stripped = true; } if (!strcmp(subs, "DMAM")) { /*dimethylaminomethylene; =R, used as the N prot.*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 3; Point->H += mul * 7; Point->N += mul; strcpy(A, strsub(STR2, A, 5, (int)(strlen(A) - 4))); stripped = true; } if (!strcmp(subs, "DMTr")) { /*dimethoxytrityl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 21; Point->H += mul * 19; Point->O += mul * 2; strcpy(A, strsub(STR2, A, 5, (int)(strlen(A) - 4))); stripped = true; } if (!strcmp(subs, "MMTr")) { /*monomethoxytrityl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 20; Point->H += mul * 16; Point->O += mul; strcpy(A, strsub(STR2, A, 5, (int)(strlen(A) - 4))); stripped = true; } if (!strcmp(subs, "TMTr")) { /*trimethoxytrityl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 22; Point->H += mul * 22; Point->O += mul * 3; strcpy(A, strsub(STR2, A, 5, (int)(strlen(A) - 4))); stripped = true; } } if (strlen(A) >= 3 && !stripped) { sprintf(subs, "%.3s", A); if (strlen(A) > 4) { if (A[3] == '_') { sprintf(STR2, "%c", A[4]); code = (sscanf(STR2, "%ld", &mul) == 0); } else mul = 1; } mul *= gmul * ggmul; if (!strcmp(subs, "Ade")) { /*Adeninyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 5; Point->H += mul * 4; Point->N += mul * 5; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "BOC")) { /*Butyloxycarbonyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 5; Point->H += mul * 9; Point->O += mul * 2; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "Cyt")) { /*Cytosinyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 4; Point->H += mul * 4; Point->N += mul * 3; Point->O += mul; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "Gua")) { /*Guaninyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 5; Point->H += mul * 4; Point->N += mul * 5; Point->O += mul; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "iBu")) { /*iso-Butyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 4; Point->H += mul * 9; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "iPr")) { /*2-Propyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 3; Point->H += mul * 7; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "MOC")) { /*Methoxycarbonyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 2; Point->H += mul * 3; Point->O += mul * 2; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "MOM")) { /*Methoxymethyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 2; Point->H += mul * 5; Point->O += mul; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "tBu")) { /*t-Butyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 4; Point->H += mul * 9; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "Thy")) { /*Thyminyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 5; Point->H += mul * 5; Point->N += mul * 2; Point->O += mul * 2; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "TMS")) { /*Trimethylsilyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 3; Point->H += mul * 9; Point->Si += mul; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "Tol")) { /*tolyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 8; Point->H += mul * 7; Point->O += mul; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } if (!strcmp(subs, "Ura")) { /*Uracilyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 4; Point->H += mul * 3; Point->N += mul * 2; Point->O += mul * 2; strcpy(A, strsub(STR2, A, 4, (int)(strlen(A) - 3))); stripped = true; } } if (strlen(A) >= 2 && !stripped) { sprintf(subs, "%.2s", A); if (strlen(A) > 3) { if (A[2] == '_') { sprintf(STR2, "%c", A[3]); code = (sscanf(STR2, "%ld", &mul) == 0); } else mul = 1; } mul *= gmul * ggmul; if (!strcmp(subs, "Ac")) { /*acetyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 2; Point->H += mul * 3; Point->O += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Bn")) { /*benzyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 7; Point->H += mul * 7; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Br")) { /*bromine*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->Br += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Bu")) { /*butyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 4; Point->H += mul * 9; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Bz")) { /*benzoyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 7; Point->H += mul * 5; Point->O += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "CE")) { /*cyanoethyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 3; Point->H += mul * 4; Point->N += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Cl")) { /*chlorine*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->Cl += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Et")) { /*ethyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 2; Point->H += mul * 5; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Me")) { /*methyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul; Point->H += mul * 3; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Ms")) { /*methanesulfonyl, mesyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul; Point->H += mul * 3; Point->O += mul * 2; Point->S += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Mg")) { /*magnesium*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->Mg += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Na")) { /*sodium*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->Na += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Ph")) { /*phenyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 6; Point->H += mul * 5; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Pr")) { /*propyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 3; Point->H += mul * 7; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Tf")) { /*trifluoromethanesulfonyl, triflyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul; Point->F += mul * 3; Point->O += mul * 2; Point->S += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Tr")) { /*trityl, triphenylmethyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 19; Point->H += mul * 15; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Ts")) { /*toluenesulfonyl, tosyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 7; Point->H += mul * 7; Point->O += mul * 2; Point->S += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } if (!strcmp(subs, "Si")) { /*silicon*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->Si += mul; strcpy(A, strsub(STR2, A, 3, (int)(strlen(A) - 2))); stripped = true; } } if (strlen(A) < 1 || stripped) continue; sprintf(subs, "%.1s", A); if (strlen(A) > 2) { if (A[1] == '_') { sprintf(STR2, "%c", A[2]); code = (sscanf(STR2, "%ld", &mul) == 0); } else mul = 1; } mul *= gmul * ggmul; if (!strcmp(subs, "B")) { /*boron*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->B += mul; } if (!strcmp(subs, "C")) { /*carbon*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul; } if (!strcmp(subs, "F")) { /*fluorine*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->F += mul; } if (!strcmp(subs, "H")) { /*hydrogen*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->H += mul; } if (!strcmp(subs, "I")) { /*iodine*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->I += mul; } if (!strcmp(subs, "K")) { /*potassium*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->K += mul; } if (!strcmp(subs, "N")) { /*nitrogen*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->N += mul; } if (!strcmp(subs, "O")) { /*oxygen*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->O += mul; } if (!strcmp(subs, "P")) { /*phosphorus*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->P += mul; } if (!strcmp(subs, "S")) { /*sulfur*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->S += mul; } if (!strcmp(subs, "Z")) { /*"Z", Benzyloxycarbonyl*/ if (debug) printf(" %s*%ld (%ld,%ld)\n", subs, mul, gmul, ggmul); Point->C += mul * 8; Point->H += mul * 7; Point->O += mul * 2; } if (!strcmp(subs, ")")) /*reset gmul*/ gmul = 1; if (!strcmp(subs, "]")) { /*reset gmul,ggmul*/ gmul = 1; ggmul = 1; } if (true) strcpy(A, strsub(STR2, A, 2, (int)(strlen(A) - 1))); } } Point = Point->Last; } Point = Current; } } main(argc, argv) int argc; Char *argv[]; { Char STR1[256], STR2[256]; Char *TEMP; PASCAL_MAIN(argc, argv); IFile = NULL; if (P_argc == 1) { printf("enter \"cht -h\" for help\n"); _Escape(0); } C = 0; H = 0; N = 0; O = 0; P = 0; S = 0; Si = 0; B = 0; Br = 0; I = 0; Cl = 0; F = 0; Mg = 0; Na = 0; K = 0; verbose = false; debug = false; fa = false; /*no file assigned*/ Count = 0; *Alert = '\0'; for (rep = 1; rep < P_argc; rep++) { if (!strcmp(strcpy(STR2, P_argv[rep]), "-v") || !strcmp(strcpy(STR1, P_argv[rep]), "--verbose")) verbose = true; if (!strcmp(strcpy(STR2, P_argv[rep]), "-d") || !strcmp(strcpy(STR1, P_argv[rep]), "--debug")) debug = true; if (!strcmp(strcpy(STR2, P_argv[rep]), "-h") || !strcmp(strcpy(STR1, P_argv[rep]), "--help")) { printf("The Chemtool drawings analyzer 1.7\n"); printf("*** Gizmo Head Software ***\n"); printf(" Radek Liboska (c) 2001\n\n"); printf("syntax: cht [-options] \n\n"); printf("Recognizes C,H,O,N,P,S,Si,B,Br,I,Cl,F,Mg,Na,K,\n"); printf( " Ac,Ade,Bn,Bu,Bz,BOC,Cyt,CE,DBAM,DMAM,DMTr,Et,Gua,iBu,iPr,Me,Ms,MOC,\n"); printf( " MOM,MMTr,Ph,Pr,tBu,Tf,Thy,Tol,Tr,Ts,TBDMS,TBDPS,TMS,TMTr,Ura,Z\n"); printf("Can handle two levels of patentheses; e.g. P[OCH(CH_3)_2]_3\n\n"); printf("options:\n"); printf(" -h or --help : this help\n"); printf(" -v or --verbose : be verbose\n"); printf(" -d or --debug : be more verbose\n\n"); _Escape(0); } if (strcpy(STR2, P_argv[rep])[0] != '-') { strcpy(STR1, P_argv[rep]); strcpy(IFile_NAME, STR1); fa = true; } } if (!fa) { printf("No file defined, enter \"cht -h\" for help\n"); _Escape(1); } if (IFile != NULL) IFile = freopen(IFile_NAME, "r", IFile); else IFile = fopen(IFile_NAME, "r"); if (IFile == NULL) _EscIO2(FileNotFound, IFile_NAME); Point = (TPoint *)Malloc(sizeof(TPoint)); Point->X = 0; Point->Y = 0; Point->C = 0; Point->H = 0; Point->N = 0; Point->O = 0; Point->P = 0; Point->S = 0; Point->Si = 0; Point->B = 0; Point->Br = 0; Point->Cl = 0; Point->F = 0; Point->I = 0; Point->Mg = 0; Point->Na = 0; Point->K = 0; Point->RecCount = Count; Point->Last = NULL; Bond = (TBond *)Malloc(sizeof(TBond)); Bond->X1 = 0; Bond->Y1 = 0; Bond->X2 = 0; Bond->Y2 = 0; Bond->RecCount = Count; Bond->Last = NULL; fgets(sss, 256, IFile); TEMP = strchr(sss, '\n'); if (TEMP != NULL) *TEMP = 0; sprintf(sss, "%.18s", strcpy(STR1, sss)); if (strcmp(sss, "Chemtool Version 1")) { printf("Not a chemtool 1.x file, enter \"cht -h\" for help\n"); _Escape(2); } fscanf(IFile, "%*[^\n]"); getc(IFile); fgets(sssb, 7, IFile); TEMP = strchr(sssb, '\n'); if (TEMP != NULL) { *TEMP = 0; ungetc('\n', IFile); } fscanf(IFile, "%ld%*[^\n]", &bonds); getc(IFile); if (bonds == 0) nobonds = true; if (!strcmp(sssb, "bonds ")) { if (bonds > 0) doBonds(); } fgets(sssb, 7, IFile); TEMP = strchr(sssb, '\n'); if (TEMP != NULL) { *TEMP = 0; ungetc('\n', IFile); } fscanf(IFile, "%ld%*[^\n]", &atoms); getc(IFile); if (!strcmp(sssb, "atoms ")) { if (atoms > 0) doLabels(); } if (IFile != NULL) fclose(IFile); IFile = NULL; if (verbose) printf("---------------------- Summary -------------------------\n"); while (Point->Last != NULL) { if (verbose) printf( "RecCount: %ld X=%ld Y=%ld C%ld H%ld N%ld O%ld P%ld S%ld Si%ld B%ld Br%ld Cl%ld F%ld I%ld Mg%ld Na%ld K%ld\n", Point->RecCount, Point->X, Point->Y, Point->C, Point->H, Point->N, Point->O, Point->P, Point->S, Point->Si, Point->B, Point->Br, Point->Cl, Point->F, Point->I, Point->Mg, Point->Na, Point->K); C += Point->C; H += Point->H; N += Point->N; O += Point->O; P += Point->P; S += Point->S; Si += Point->Si; B += Point->B; Br += Point->Br; Cl += Point->Cl; F += Point->F; I += Point->I; Mg += Point->Mg; Na += Point->Na; K += Point->K; Point = Point->Last; } if (H < 0) /*overlapped bonds*/ H = 0; M = C * 12.011 + H * 1.0079 + N * 14.0067 + O * 15.9994 + P * 30.97376 + S * 32.064 + Si * 28.086 + B * 10.81 + Br * 79.904 + Cl * 35.453 + F * 18.9984 + I * 126.9045 + Mg * 24.305 + Na * 22.98977 + K * 39.098; Me = C * 12 + H * 1.007825037 + N * 14.003074008 + O * 15.99491464 + P * 30.9737634 + S * 31.9720718 + Si * 27.9769284 + B * 11.0093053 + Br * 78.9183361 + Cl * 34.968852729 + F * 18.99840325 + I * 126.904477 + Mg * 23.9850450 + Na * 22.9897697 + K * 38.9637079; if (Me > 0 && *Alert == '\0') { if (C > 1) printf("C%ld", C); if (C == 1) putchar('C'); if (H > 1) printf("H%ld", H); if (H == 1) putchar('H'); if (N > 1) printf("N%ld", N); if (N == 1) putchar('N'); if (O > 1) printf("O%ld", O); if (O == 1) putchar('O'); if (P > 1) printf("P%ld", P); if (P == 1) putchar('P'); if (S > 1) printf("S%ld", S); if (S == 1) putchar('S'); if (Si > 1) printf("Si%ld", Si); if (Si == 1) printf("Si"); if (B > 1) printf("B%ld", B); if (B == 1) putchar('B'); if (Br > 1) printf("Br%ld", Br); if (Br == 1) printf("Br"); if (Cl > 1) printf("Cl%ld", Cl); if (Cl == 1) printf("Cl"); if (F > 1) printf("F%ld", F); if (F == 1) putchar('F'); if (I > 1) printf("I%ld", I); if (I == 1) putchar('I'); if (Mg > 1) printf("Mg%ld", Mg); if (Mg == 1) printf("Mg"); if (Na > 1) printf("Na%ld", Na); if (Na == 1) printf("Na"); if (K > 1) printf("K%ld", K); if (K == 1) putchar('K'); printf(" [%2.3f]", M); printf(" Me=%2.10f ", Me); if (C > 0) printf("%4.2f%%C;", C * 12.011 * 100 / M); if (H > 0) printf("%4.2f%%H;", H * 1.0079 * 100 / M); if (B > 0) printf("%4.2f%%B;", B * 10.81 * 100 / M); if (N > 0) printf("%4.2f%%N;", N * 14.0067 * 100 / M); if (O > 0) printf("%4.2f%%O;", O * 15.9994 * 100 / M); if (P > 0) printf("%4.2f%%P;", P * 30.97376 * 100 / M); if (S > 0) printf("%4.2f%%S;", S * 32.0640 * 100 / M); if (K > 0) printf("%4.2f%%K;", K * 39.098 * 100 / M); if (Mg > 0) printf("%4.2f%%Mg;", Mg * 24.305 * 100 / M); if (Na > 0) printf("%4.2f%%Na;", Na * 22.98977 * 100 / M); if (Si > 0) printf("%4.2f%%Si;", Si * 28.086 * 100 / M); if (Br > 0) printf("%4.2f%%Br;", Br * 79.904 * 100 / M); if (Cl > 0) printf("%4.2f%%Cl;", Cl * 35.453 * 100 / M); if (F > 0) printf("%4.2f%%F;", F * 18.9984 * 100 / M); if (I > 0) printf("%4.2f%%I;", I * 126.9045 * 100 / M); } else { if (*Alert != '\0') printf("%s overlapped bonds !", Alert); else printf("C0H0 [0.00] Me=0.0000000000 0.00%%C;0.00%%H"); } putchar('\n'); exit(EXIT_SUCCESS); } /* End. */