static Tok *toknext() { Tok *t; int c; eatspace(); c = peek(); if (c == End) { t = mktok(0); } else if (c == '\n') { curloc.line++; next(); t = mktok(Tendln); } else if (isalpha(c) || c == '_' || c == '$') { t = kwident(); } else if (c == '"') { t = strlit(); } else if (c == '\'') { t = charlit(); } else if (isdigit(c)) { t = numlit(); } else if (c == '@') { t = typaram(); } else { t = oper(); } if (!t || t->type == Terror) lfatal(curloc, "Unable to parse token starting with %c", c); return t; }
nsresult NumberingScheme::Init (nsIRDFDataSource* aDS, nsIRDFResource* aResource) { mComponents.Clear(); NS_ENSURE_ARG(aDS); NS_ENSURE_ARG(aResource); mResource = aResource; nsresult rv; nsCOMPtr<nsIRDFService> rdfsvc( do_GetService("@mozilla.org/rdf/rdf-service;1")); nsCOMPtr<nsIRDFDataSource> schemads; rdfsvc->GetDataSourceBlocking("chrome://celtx/content/schema.rdf", getter_AddRefs(schemads)); nsCOMPtr<nsIRDFCompositeDataSource> compds = do_CreateInstance( "@mozilla.org/rdf/datasource;1?name=composite-datasource"); compds->AddDataSource(schemads); compds->AddDataSource(aDS); nsCOMPtr<nsIRDFResource> posarc, numarc, prearc, sufarc; rdfsvc->GetResource(NS_LITERAL_CSTRING("http://celtx.com/NS/v1/position"), getter_AddRefs(posarc)); rdfsvc->GetResource(NS_LITERAL_CSTRING("http://celtx.com/NS/v1/numbering"), getter_AddRefs(numarc)); rdfsvc->GetResource(NS_LITERAL_CSTRING("http://celtx.com/NS/v1/prefix"), getter_AddRefs(prearc)); rdfsvc->GetResource(NS_LITERAL_CSTRING("http://celtx.com/NS/v1/suffix"), getter_AddRefs(sufarc)); nsCOMPtr<nsIRDFContainer> cont = do_CreateInstance( "@mozilla.org/rdf/container;1"); rv = cont->Init(compds, aResource); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsISimpleEnumerator> elements; rv = cont->GetElements(getter_AddRefs(elements)); NS_ENSURE_SUCCESS(rv, rv); if (! elements) return NS_ERROR_INVALID_ARG; PRUint32 processed = 0; PRBool hasMore; rv = elements->HasMoreElements(&hasMore); while (NS_SUCCEEDED(rv) && hasMore) { nsCOMPtr<nsISupports> elem; rv = elements->GetNext(getter_AddRefs(elem)); if (NS_FAILED(rv) || ! elem) break; nsCOMPtr<nsIRDFResource> scheme(do_QueryInterface(elem)); if (! scheme) break; nsCOMPtr<nsIRDFNode> posnode, numnode, prenode, sufnode; compds->GetTarget(scheme, posarc, PR_TRUE, getter_AddRefs(posnode)); compds->GetTarget(scheme, numarc, PR_TRUE, getter_AddRefs(numnode)); compds->GetTarget(scheme, prearc, PR_TRUE, getter_AddRefs(prenode)); compds->GetTarget(scheme, sufarc, PR_TRUE, getter_AddRefs(sufnode)); nsCOMPtr<nsIRDFLiteral> numlit(do_QueryInterface(numnode)), poslit(do_QueryInterface(posnode)), prelit(do_QueryInterface(prenode)), suflit(do_QueryInterface(sufnode)); NumberingComponent component; nsXPIDLString position, numbering, prefix, suffix; if (numlit) numlit->GetValue(getter_Copies(numbering)); if (numbering.IsEmpty()) break; if (poslit) poslit->GetValue(getter_Copies(position)); if (! position.IsEmpty()) { if (position.Equals(NS_LITERAL_STRING("before"))) component.position = NumberingComponent::BEFORE; else if (position.Equals(NS_LITERAL_STRING("after"))) component.position = NumberingComponent::AFTER; else break; } else if (processed > 0) break; if (numbering.Equals(NS_LITERAL_STRING("number"))) component.numbering = NumberingComponent::NUMBER; else if (numbering.Equals(NS_LITERAL_STRING("letter"))) component.numbering = NumberingComponent::LETTER; else break; if (prelit) prelit->GetValue(getter_Copies(prefix)); if (! prefix.IsEmpty()) component.prefix.Assign(prefix); if (suflit) suflit->GetValue(getter_Copies(suffix)); if (! suffix.IsEmpty()) component.suffix.Assign(suffix); mComponents.AppendElement(component); ++processed; rv = elements->HasMoreElements(&hasMore); } return mComponents.Length() ? NS_OK : NS_ERROR_FAILURE; }