kICSSParserIID,
NS_GET_IID(nsICSSParser),
int main(int argc, char** argv){  nsComponentManager::RegisterComponent(kEventQueueServiceCID, NULL, NULL, XPCOM_DLL, PR_FALSE, PR_FALSE);  nsComponentManager::RegisterComponent(kIOServiceCID, NULL, NULL, NETLIB_DLL, PR_FALSE, PR_FALSE);  nsComponentManager::RegisterComponent(kCSSParserCID, NULL, NULL, LAYOUT_DLL, PR_FALSE, PR_FALSE);  nsresult rv;  PRBool verbose = PR_FALSE;  nsString* string = nsnull;  int i;  for (i = 1; i < argc; i++) {    if (argv[i][0] == '-') {      if (strcmp(argv[i], "-v") == 0) {        verbose = PR_TRUE;      }      else if (strcmp(argv[i], "-s") == 0) {        if ((nsnull != string) || (i == argc - 1)) {          Usage();          return -1;        }        string = new nsString;        string->AssignWithConversion(argv[++i]);      }      else {        Usage();        return -1;      }    }    else      break;  }  // Create the Event Queue for this thread...  nsIEventQueueService* pEventQService = nsnull;  rv = nsServiceManager::GetService(kEventQueueServiceCID,                                    kIEventQueueServiceIID,                                    (nsISupports **)&pEventQService);  if (NS_SUCCEEDED(rv)) {    // XXX: What if this fails?    rv = pEventQService->CreateThreadEventQueue();  }  // Create parser  nsCOMPtr<nsICSSParser> css;  rv = nsComponentManager::CreateInstance(kCSSParserCID,	nsnull,	kICSSParserIID,	getter_AddRefs(css));	  if (NS_FAILED(rv)) {    printf("can't create css parser: %d\n", rv);    return -1;  }  PRUint32 infoMask;  css->GetInfoMask(infoMask);  printf("CSS parser supports %x\n", infoMask);  if (nsnull != string) {    nsIStyleRule* rule;    rv = css->ParseDeclarations(*string, nsnull, rule);    if (NS_OK == rv) {      if (verbose && (nsnull != rule)) {        rule->List();      }    }    else {      printf("ParseDeclarations failed: rv=%d\n", rv);    }  }  else {    for (; i < argc; i++) {      char* urlName = argv[i];      // Create url object      nsIURI* url;      NS_WITH_SERVICE(nsIIOService, service, kIOServiceCID, &rv);      if (NS_FAILED(rv)) return -1;      nsIURI *uri = nsnull;      rv = service->NewURI(urlName, nsnull, &uri);      if (NS_FAILED(rv)) return -1;      rv = uri->QueryInterface(NS_GET_IID(nsIURI), (void**)&url);      NS_RELEASE(uri);      if (NS_OK != rv) {        printf("invalid URL: '%s'\n", urlName);        return -1;      }      // Get an input stream from the url      nsIInputStream* in;      rv = NS_OpenURI(&in, url);      if (rv != NS_OK) {        printf("open of url('%s') failed: error=%x\n", urlName, rv);        continue;      }      // Translate the input using the argument character set id into unicode      nsIUnicharInputStream* uin;      rv = NS_NewConverterStream(&uin, nsnull, in);      if (NS_OK != rv) {        printf("can't create converter input stream: %d\n", rv);        return -1;      }      // Parse the input and produce a style set      nsICSSStyleSheet* sheet;      rv = css->Parse(uin, url, sheet);      if (NS_OK == rv) {        if (verbose) {          sheet->List();        }      }      else {        printf("parse failed: %d\n", rv);      }      url->Release();      in->Release();      uin->Release();      sheet->Release();    }  }  /* Release the event queue for the thread */  if (nsnull != pEventQService) {    pEventQService->DestroyThreadEventQueue();    nsServiceManager::ReleaseService(kEventQueueServiceCID, pEventQService);  }  return 0;}