// Gather data up to next start-of-tag or end-of-buffer. // Translate entity references (&). // Ignore non-whitespace control characters and get rid of \r's. // If find non-empty token, fill in a[*pai], bump *pai, and return Data. // Otherwise return -1; static int getdata(TokenSource* ts, int firstc, int starti, Token* a, int* pai) { Rune* s; int j; int c; Token* tok; Rune buf[SMALLBUFSIZE]; s = nil; j = 0; for(c = firstc; c >= 0; c = getchar(ts)){ if(c == '&') { c = ampersand(ts); if(c < 0) break; } else if(c < ' ') { if(isspace(c)) { if(c == '\r') { // ignore it unless no following '\n', // in which case treat it like '\n' c = getchar(ts); if(c != '\n') { if(c >= 0) ungetchar(ts, c); c = '\n'; } } } else { if(warn) fprint(2, "warning: non-whitespace control character %d ignored\n", c); c = 0; } } else if(c == '<') { ungetchar(ts, c); break; } if(c != 0) { buf[j++] = c; if(j == nelem(buf)-1) { s = buftostr(s, buf, j); j = 0; } } } s = buftostr(s, buf, j); if(s == nil) return -1; tok = &a[(*pai)++]; tok->tag = Data; tok->text = s; tok->attr = nil; tok->starti = starti; return Data; }
// For case where source isn't HTML. // Just make data tokens, one per line (or partial line, // at end of buffer), ignoring non-whitespace control // characters and dumping \r's. // If find non-empty token, fill in a[*pai], bump *pai, and return Data. // Otherwise return -1; static int getplaindata(TokenSource* ts, Token* a, int* pai) { Rune* s; int j; int starti; int c; Token* tok; Rune buf[BIGBUFSIZE]; s = nil; j = 0; starti = ts->i; for(c = getchar(ts); c >= 0; c = getchar(ts)) { if(c < ' ') { if(isspace(c)) { if(c == '\r') { // ignore it unless no following '\n', // in which case treat it like '\n' c = getchar(ts); if(c != '\n') { if(c >= 0) ungetchar(ts, c); c = '\n'; } } } else c = 0; } if(c != 0) { buf[j++] = c; if(j == nelem(buf)-1) { s = buftostr(s, buf, j); j = 0; } } if(c == '\n') break; } s = buftostr(s, buf, j); if(s == nil) return -1; tok = &a[(*pai)++]; tok->tag = Data; tok->text = s; tok->attr = nil; tok->starti = starti; return Data; }
bool inyn() { std::string temp; buftostr( temp ); if ( temp.size() && toupper( temp[ 0 ] ) == 'Y' ) return true; return false; }
// We've just seen a '<'. Gather up stuff to closing '>' (if buffer // ends before then, return -1). // If it's a tag, look up the name, gather the attributes, and return // the appropriate token. // Else it's either just plain data or some kind of ignorable stuff: // return Data or Comment as appropriate. // If it's not a Comment, put it in a[*pai] and bump *pai. static int gettag(TokenSource* ts, int starti, Token* a, int* pai) { int rbra; int ans; Attr* al; int nexti; int c; int ti; int afnd; int attid; int quote; Rune* val; int nv; int i; int tag; Token* tok; Rune buf[BIGBUFSIZE]; rbra = 0; nexti = ts->i; tok = &a[*pai]; tok->tag = Notfound; tok->text = nil; tok->attr = nil; tok->starti = starti; c = getchar(ts); if(c == '/') { rbra = RBRA; c = getchar(ts); } if(c < 0) goto eob_done; if(c >= 256 || !isalpha(c)) { // not a tag if(c == '!') { ans = comment(ts); if(ans != -1) return ans; goto eob_done; } else { backup(ts, nexti); tok->tag = Data; tok->text = _Strdup(L"<"); (*pai)++; return Data; } } // c starts a tagname buf[0] = c; i = 1; while(1) { c = getchar(ts); if(c < 0) goto eob_done; if(!ISNAMCHAR(c)) break; // if name is bigger than buf it won't be found anyway... if(i < BIGBUFSIZE) buf[i++] = c; } if(_lookup(tagtable, Numtags, buf, i, &tag)) tok->tag = tag + rbra; else tok->text = _Strndup(buf, i); // for warning print, in build // attribute gathering loop al = nil; while(1) { // look for "ws name" or "ws name ws = ws val" (ws=whitespace) // skip whitespace attrloop_continue: while(c < 256 && isspace(c)) { c = getchar(ts); if(c < 0) goto eob_done; } if(c == '>') goto attrloop_done; if(c == '<') { if(warn) fprint(2, "warning: unclosed tag\n"); ungetchar(ts, c); goto attrloop_done; } if(c >= 256 || !isalpha(c)) { if(warn) fprint(2, "warning: expected attribute name\n"); // skipt to next attribute name while(1) { c = getchar(ts); if(c < 0) goto eob_done; if(c < 256 && isalpha(c)) goto attrloop_continue; if(c == '<') { if(warn) fprint(2, "warning: unclosed tag\n"); ungetchar(ts, 60); goto attrloop_done; } if(c == '>') goto attrloop_done; } } // gather attribute name buf[0] = c; i = 1; while(1) { c = getchar(ts); if(c < 0) goto eob_done; if(!ISNAMCHAR(c)) break; if(i < BIGBUFSIZE-1) buf[i++] = c; } afnd = _lookup(attrtable, Numattrs, buf, i, &attid); if(warn && !afnd) { buf[i] = 0; fprint(2, "warning: unknown attribute name %S\n", buf); } // skip whitespace while(c < 256 && isspace(c)) { c = getchar(ts); if(c < 0) goto eob_done; } if(c != '=') { if(afnd) al = newattr(attid, nil, al); goto attrloop_continue; } //# c is '=' here; skip whitespace while(1) { c = getchar(ts); if(c < 0) goto eob_done; if(c >= 256 || !isspace(c)) break; } quote = 0; if(c == '\'' || c == '"') { quote = c; c = getchar(ts); if(c < 0) goto eob_done; } val = nil; nv = 0; while(1) { valloop_continue: if(c < 0) goto eob_done; if(c == '>') { if(quote) { // c might be part of string (though not good style) // but if line ends before close quote, assume // there was an unmatched quote ti = ts->i; while(1) { c = getchar(ts); if(c < 0) goto eob_done; if(c == quote) { backup(ts, ti); buf[nv++] = '>'; if(nv == BIGBUFSIZE-1) { val = buftostr(val, buf, nv); nv = 0; } c = getchar(ts); goto valloop_continue; } if(c == '\n') { if(warn) fprint(2, "warning: apparent unmatched quote\n"); backup(ts, ti); c = '>'; goto valloop_done; } } } else goto valloop_done; } if(quote) { if(c == quote) { c = getchar(ts); if(c < 0) goto eob_done; goto valloop_done; } if(c == '\r') { c = getchar(ts); goto valloop_continue; } if(c == '\t' || c == '\n') c = ' '; } else { if(c < 256 && isspace(c)) goto valloop_done; } if(c == '&') { c = ampersand(ts); if(c == -1) goto eob_done; } buf[nv++] = c; if(nv == BIGBUFSIZE-1) { val = buftostr(val, buf, nv); nv = 0; } c = getchar(ts); } valloop_done: if(afnd) { val = buftostr(val, buf, nv); al = newattr(attid, val, al); } } attrloop_done: tok->attr = al; (*pai)++; return tok->tag; eob_done: if(warn) fprint(2, "warning: incomplete tag at end of page\n"); backup(ts, nexti); tok->tag = Data; tok->text = _Strdup(L"<"); return Data; }
// The rules for lexing scripts are different (ugh). // Gather up everything until see an "</" tagnames[tok] ">" static int getscriptdata(TokenSource* ts, int firstc, int starti, Token* a, int* pai, int findtag) { Rune* s; int j; int tstarti; int savei; int c; int tag; int done; Token* tok; Rune buf[BIGBUFSIZE]; s = nil; j = 0; tstarti = starti; c = firstc; done = 0; while(c >= 0) { if(c == '<') { // other browsers ignore stuff to end of line after <! savei = ts->i; c = getchar(ts); if(c == '!') { if(comment(ts) == -1) break; if(c == '\r') c = getchar(ts); if(c == '\n') c = getchar(ts); } else if(c >= 0) { backup(ts, savei); tag = gettag(ts, tstarti, a, pai); if(tag == -1) break; if(tag != Comment) (*pai)--; backup(ts, tstarti); if(tag == findtag + RBRA) { done = 1; break; } // here tag was not the one we were looking for, so take as regular data c = getchar(ts); } } if(c < 0) break; if(c != 0) { buf[j++] = c; if(j == nelem(buf)-1) { s = buftostr(s, buf, j); j = 0; } } tstarti = ts->i; c = getchar(ts); } if(done || ts->i == ts->edata) { s = buftostr(s, buf, j); tok = &a[(*pai)++]; tok->tag = Data; tok->text = s; tok->attr = nil; tok->starti = starti; return Data; } free(s); backup(ts, starti); return -1; }
bool LoggerContestLog::GJVload( void ) { std::string temp; logCount = 0; // load the LoggerContestLog details from file_desc clearBuffer(); readBlock( 0 ); buffpt = 0; buftostr( temp ); if ( atoi( temp.c_str() ) != 0 ) { MinosParameters::getMinosParameters() ->mshowMessage( "Invalid block 0 in LoggerContestLog file" ); return false; } buftostr( temp ); if ( strnicmp( temp, GJVVERSION, VERLENGTH ) != 0 ) { MinosParameters::getMinosParameters() ->mshowMessage( String( "Invalid LoggerContestLog file format (" ) + temp.c_str() + ", " + GJVVERSION + " expected)" ); return false; } buftostr( band ); buftostr( name ); buftostr( temp ); mycall = callsign( strupr( temp ) ); buftostr( myloc.loc ); buftostr( location ); otherExchange.setValue( inyn() ); /*bool CC_mult =*/ inyn(); /* if ( CC_mult ) { Country_mult = true; County_mult = true; // District_mult = true; } */ locMult.setValue( inyn() ); buftostr( temp ); logCount = atoi( temp.c_str() ); buftostr( power ); buftostr( temp ); // buftostr( mainOpNow ); buftostr( temp ); // buftostr( secondOpNow ); buftostr( mode ); inyn(); scoreMode.setValue( PPKM ); // don't take any notice of radial flag! setPostEntry( inyn() ); if ( inyn() ) { scoreMode.setValue( PPQSO ); } countryMult.setValue( inyn() ); if ( inyn() ) { // County_mult = true; // District_mult = true; } districtMult.setValue( inyn() ); powerWatts.setValue( inyn() ); if ( inyn() ) { // scoreMode = GSPECIAL; } allowLoc8.setValue( inyn() ); RSTField.setValue( !inyn() ); serialField.setValue( !inyn() ); locatorField.setValue( !inyn() ); QTHField.setValue( !inyn() ); return true; }
void buftostr( MinosItem<std::string> &str ) { std::string temp; buftostr( temp ); str.setInitialValue( temp ); }