static void ScanCodeBlock(void) { int startline = yyline; /* keutzer char c; */ int c; if(curCdBlock==NULL) { curCdBlock = CodeGetBlock(); curCdBlock = CodeMarkLine(curCdBlock,yyline); } while((c=getc(fin))!=EOF) { if (c=='}') return; else if (c=='$') ScanTreeReference(); else curCdBlock = CodeStoreChar(curCdBlock, c); if (c=='\n') yyline++; if (c=='"') ScanString(getput); else if (c=='\'') ScanChar(); else if (c=='/') { if ((c=getc(fin))=='*') { curCdBlock = CodeStoreChar(curCdBlock, '*'); ScanComment(getput); } else ungetc(c, fin); } else if (c=='{') { ScanCodeBlock(); curCdBlock = CodeStoreChar (curCdBlock, '}'); } } yyerror2("{ on line %d has no closing }", startline); nerrors++; }
static intstar4 SubScr( int info, char PGM *adv_ss_ptr, int size ) { //========================================================================== // Get a subscript list. signed_32 ss[MAX_DIM]; act_dim_list dim_list; intstar4 PGM *dim_ptr; signed_32 PGM *ss_ptr; intstar4 lo; intstar4 offset; int num_ss; dim_list.dim_flags = 0; _SetDimCount( dim_list.dim_flags, _GetNMLSubScrs( info ) ); dim_list.num_elts = 1; dim_ptr = &dim_list.subs_1_lo; num_ss = _GetNMLSubScrs( info ); ss_ptr = ss; for(;;) { if( !ScanSNum( ss_ptr ) ) return( FALSE ); ++ss_ptr; lo = *(intstar4 PGM *)adv_ss_ptr; adv_ss_ptr += sizeof( intstar4 ); dim_list.num_elts *= *(uint PGM *)adv_ss_ptr; *dim_ptr = lo; ++dim_ptr; *dim_ptr = lo + *(uint PGM *)adv_ss_ptr - 1; ++dim_ptr; adv_ss_ptr += sizeof( uint ); --num_ss; if( num_ss == 0 ) break; if( !ScanChar( ',' ) ) break; } if( !ScanChar( ')' ) ) return( FALSE ); if( !DoSubscript( &dim_list, ss, &offset ) ) return( FALSE ); NmlInAddr = (char HPGM *)NmlInAddr + offset * size; return( TRUE ); }
inline char DecodeHalf(short s) const { IMatrix r; #ifdef DEBUG cout << "Half word to decode: "; Print(s, 8); #endif MatrixProduct(ScanChar(s), hm, r); #ifdef DEBUG cout << "Product Vector: "; PrintArray(r[0]); #endif return FindChar(r[0]); }
static bool SubStr( string *scb ) { //===================================== // Get a substring list. intstar4 ss1; intstar4 ss2; ss1 = 1; ss2 = scb->len; if( !ScanChar( ':' ) ) { if( !ScanSNum( &ss1 ) ) return( FALSE ); if( !ScanChar( ':' ) ) return( FALSE ); } if( !ScanChar( ')' ) ) { if( !ScanSNum( &ss2 ) ) return( FALSE ); if( !ScanChar( ')' ) ) return( FALSE ); } if( !DoSubstring( ss1, ss2, scb->len ) ) return( FALSE ); scb->len = ss2 - ss1 + 1; scb->strptr = scb->strptr + ss1 - 1; return( TRUE ); }
// **************************************************************************** // Constructor: Atom::Atom // // Arguments: // line the line of text in a PDB file // // Programmer: Jeremy Meredith // Creation: March 23, 2006 // // Modifications: // Brad Whitlock, Fri Jun 2 13:15:47 PST 2006 // Added Jeremy's fix for yet another style of ATOM line. // // Jeremy Meredith, Mon Aug 28 17:58:02 EDT 2006 // Changed the scanning to (a) match the PDB spec document more // effectively, (b) be faster, and (c) handle some missing elements // (short lines) better. // // Jeremy Meredith, Wed Oct 17 11:27:10 EDT 2007 // Added compound support. // // **************************************************************************** eavlPDBImporter::Atom::Atom(const char *line, int cmpnd) { char record[7]; int len = strlen(line); ScanString(line, len, 1, 6, record); ScanInt (line, len, 7, 11, &serial); ScanString(line, len, 13, 16, name); ScanChar (line, len, 17, &altloc); ScanString(line, len, 18, 20, resname); ScanChar (line, len, 22, &chainid); ScanInt (line, len, 23, 26, &resseq); ScanChar (line, len, 27, &icode); ScanFloat (line, len, 31, 38, &x); ScanFloat (line, len, 39, 46, &y); ScanFloat (line, len, 47, 54, &z); ScanFloat (line, len, 55, 60, &occupancy); ScanFloat (line, len, 61, 66, &tempfactor); ScanString(line, len, 73, 76, segid); ScanString(line, len, 77, 78, element); ScanString(line, len, 79, 80, charge); // Left-justify element names if (element[0] == ' ') { element[0] = element[1]; element[1] = '\0'; } if((atomicnumber = ElementNameToAtomicNumber(element)) < 0) { // We have a weird file that does not keep the element name in // the place designated by the ATOM record. Files like this seem // to use the space for a line number. Check columns 12,13 // for the atom number. if(line[12] == ' ' || (line[12] >= '0' && line[12] <= '9')) { element[0] = line[13]; element[1] = '\0'; } else if (line[13] >= '0' && line[13] <= '9') { element[0] = line[12]; element[1] = '\0'; } else { element[0] = line[12]; element[1] = line[13]; } atomicnumber = ElementNameToAtomicNumber(element); if (atomicnumber < 0 && element[1] != '\0') { element[1] = '\0'; atomicnumber = ElementNameToAtomicNumber(element); } if (atomicnumber < 0) { char msg[2000]; snprintf(msg, 2000, "Unknown element name <%s> in line: %s", element, line); THROW(eavlException, msg); } } // Shift spaces out of the resname. if(resname[0] == ' ') { if(resname[1] == ' ') { resname[0] = resname[2]; resname[1] = '\0'; } else { resname[0] = resname[1]; resname[1] = resname[2]; resname[2] = '\0'; } } // Look up the residue number from the name. if((residuenumber = ResiduenameToNumber(resname)) < 0) { residuenumber = 0; } backbone = false; if (strcmp(name, " N ")==0 || strcmp(name, " C ")==0 || strcmp(name, " CA ")==0) { backbone = true; } compound = cmpnd; }