⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selector.c

📁 HTML-XML-utils由一套小型C程序(过滤器)组成
💻 C
📖 第 1 页 / 共 2 页
字号:
	s++;	state = ATTR;      } else errexit("Expected letter instead of \"%c\" after \"[\"",*s);      break;    case ATTR:					/* Inside attrib name */      if (isnmchar(*s)) {strappc(&sel->attribs->name, *s); s++;}      else state = AFTER_ATTR;      break;    case AFTER_ATTR:      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = AFTER_ATTR; state = SLASH;}      else if (*s == ']') {s++; sel->attribs->op = Exists; state = AFTER_TYPE;}      else if (*s == '~') {s++; sel->attribs->op = Includes; state = EQ;}      else if (*s == '|') {s++; sel->attribs->op = LangMatch; state=EQ;}      else if (*s == '^') {s++; sel->attribs->op = StartsWith; state=EQ;}      else if (*s == '$') {s++; sel->attribs->op = EndsWidth; state=EQ;}      else if (*s == '*') {s++; sel->attribs->op = Contains; state = EQ;}      else {sel->attribs->op = Equals; state = EQ;}      break;    case EQ:					/* Expect '=' */      if (*s != '=') errexit("Expected '=' instead of \"%c\"", *s);      else {s++; sel->attribs->value = newstring(""); state=START_VALUE;}      break;    case START_VALUE:				/* After '=' */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = START_VALUE; state=SLASH;}      else if (*s == '"') {s++; state = DSTRING;}      else if (*s == '\'') {s++; state = SSTRING;}      else if (!isnmstart(*s)) errexit("Syntax error at \"%c\"\n", *s);      else {strappc(&sel->attribs->value, *s); s++; state = VALUE;}      break;    case DSTRING:				/* Inside "..." */      if (*s == '"') {s++; state = AFTER_VALUE;}      else {strappc(&sel->attribs->value, *s); s++;}      break;    case SSTRING:				/* Inside "..." */      if (*s == '\'') {s++; state = AFTER_VALUE;}      else {strappc(&sel->attribs->value, *s); s++;}      break;    case VALUE:					/* Inside keyword */      if (isnmchar(*s)) {strappc(&sel->attribs->value, *s); s++;}      else state = AFTER_VALUE;      break;    case AFTER_VALUE:				/* Expect ']' */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = AFTER_VALUE; state = HASH;}      else if (*s == ']') {s++; state = AFTER_TYPE;}      else errexit("Expected ']' instead of \"%c\"\n", *s);      break;    case START_PSEUDO:				/* After ':' */      new(pseudosel);      pseudosel->next = sel->pseudos;      sel->pseudos = pseudosel;      if (*s == 'r' || *s == 'R') {s++; state = PSEUDO_R;}      else if (*s == 'n' || *s == 'N') {s++; state = PSEUDO_N;}      else if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_F;}      else if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_L;}      else errexit("Unknown pseudo-class \":%c...\"\n", *s);      break;    case PSEUDO_R:				/* After ':r' */      if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_RO;}      else errexit("Unknown pseudo-class \":r%c...\"\n", *s);      break;    case PSEUDO_RO:				/* After ':ro' */      if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_ROO;}      else errexit("Unknown pseudo-class \":ro%c...\"\n", *s);      break;    case PSEUDO_ROO:				/* After ':roo' */      if (*s == 't' || *s == 'T') {sel->pseudos->type = Root; s++; state=PSEUDO_ROOT;}      else errexit("Unknown pseudo-class \":roo%c...\"\n", *s);      break;    case PSEUDO_ROOT:				/* After ':root' */      if (!isnmchar(*s)) state = AFTER_TYPE;      else errexit("Unknown pseudo-class \":root%c...\"\n", *s);      break;    case PSEUDO_N:				/* After ':n' */      if (*s == 't' || *s == 'T') {s++; state = PSEUDO_NT;}      else errexit("Unknown pseudo-class \":n%c...\"\n", *s);      break;    case PSEUDO_NT:				/* After ':nt' */      if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_NTH;}      else errexit("Unknown pseudo-class \":nt%c...\"\n", *s);      break;    case PSEUDO_NTH:				/* After ':nth' */      if (*s == '-') {s++; state = PSEUDO_NTH_;}      else errexit("Unknown pseudo-class \":nth%c...\"\n", *s);      break;    case PSEUDO_NTH_:				/* After ':nth_' */      if (*s == 'c' || *s == 'C') {s++; state = PSEUDO_NTH_C;}      else if (*s == 'o' || *s == 'O') {s++; state = PSEUDO_NTH_O;}      else errexit("Unknown pseudo-class \":nth_%c...\"\n", *s);      break;    case PSEUDO_NTH_C:				/* After ':nth_c' */      if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_NTH_CH;}      else errexit("Unknown pseudo-class \":nth_c%c...\"\n", *s);      break;    case PSEUDO_NTH_CH:				/* After ':nth_ch' */      if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_NTH_CHI;}      else errexit("Unknown pseudo-class \":nth_ch%c...\"\n", *s);      break;    case PSEUDO_NTH_CHI:			/* After ':nth_chi' */      if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_NTH_CHIL;}      else errexit("Unknown pseudo-class \":nth_chi%c...\"\n", *s);      break;    case PSEUDO_NTH_CHIL:			/* After ':nth_chil' */      if (*s == 'd' || *s == 'D') {s++; state = PSEUDO_NTH_CHILD;}      else errexit("Unknown pseudo-class \":nth_chil%c...\"\n", *s);      break;    case PSEUDO_NTH_CHILD:			/* After ':nth_child' */      if (*s == '(') {s++; state = PSEUDO_NTH_CHILD_;}      else errexit("Unknown pseudo-class \":nth_child%c...\"\n", *s);      break;    case PSEUDO_NTH_CHILD_:			/* After ':nth_child(' */      sel->pseudos->type = NthChild; sel->pseudos->a = 0;      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (isdigit(*s)) {saved_state = AFTER_MUL; state = START_INT;}      else if (*s == '-') {s++; state = PSEUDO__MINUS;}      else if (*s == 'o' || *s == 'O') {s++; state = PSEUDO__O;}      else if (*s == 'e' || *s == 'E') {s++; state = PSEUDO__E;}      else if (*s == 'n' || *s == 'N') {s++; sel->pseudos->a = 1;        state=AFTER_MUL_N;}      else errexit("Expected digit after \"nth-child(\" at \"%c\"\n",*s);      break;    case PSEUDO__MINUS:				/* After :nth-...(- */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (isdigit(*s)) {saved_state = PSEUDO__NEG; state=START_INT;}      else if (*s == 'n' || *s == 'N') {s++; sel->pseudos->a = -1;        state=AFTER_MUL_N;}      else errexit("Expected digit after \":nth-...(\" at \"%c\"\n",*s);      break;    case PSEUDO__NEG:				/* After -<num> */      sel->pseudos->b = -sel->pseudos->b; state = AFTER_MUL;      break;    case PSEUDO__O:				/* After :nth...(o */      if (*s == 'd' || *s == 'D') {s++; state = PSEUDO__OD;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__OD:				/* After :nth...(od */      if (*s == 'd' || *s == 'D') {s++; state = PSEUDO__ODD;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__ODD:				/* After :nth-...(odd */      if (!isnmchar(*s)) {state = END_PSEUDO;        sel->pseudos->a = 2; sel->pseudos->b = 1;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__E:				/* After :nth-...(e */      if (*s == 'v' || *s == 'V') {s++; state = PSEUDO__EV;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__EV:				/* After :nth-...(ev */      if (*s == 'e' || *s == 'E') {s++; state = PSEUDO__EVE;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__EVE:				/* After :nth-...(eve */      if (*s == 'n' || *s == 'N') {s++; state = PSEUDO__EVEN;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case PSEUDO__EVEN:				/* Afte :nth-...(even */      if (!isnmchar(*s)) {state = END_PSEUDO;        sel->pseudos->a = 2; sel->pseudos->b = 0;}      else errexit("Illegal character \"%c\" in \":nth-...(\"\n", *s);      break;    case START_INT:				/* At a digit */      n = *s - '0'; s++; state = INT;      break;    case INT:					/* Inside number */      if (isdigit(*s)) {n = 10 * n + *s - '0'; s++;}      else {sel->pseudos->b = n; state = saved_state;}      break;    case AFTER_MUL:				/* After "...(<num>" */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (*s == ')') {s++; state = AFTER_TYPE;}      else if (*s == 'n' || *s == 'N') {s++; state = AFTER_MUL_N;        sel->pseudos->a = sel->pseudos->b; sel->pseudos->b = 0;}      else errexit("Illegal character \"%c\"\n", *s);      break;    case AFTER_MUL_N:				/* After "...(<num>N" */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (*s == '+') {s++; state = AFTER_MUL_NPLUS;}      else if (*s == ')') {s++; state = AFTER_TYPE;}      else errexit("Illegal character \"%c\"\n", *s);      break;    case AFTER_MUL_NPLUS:			/* After "...(<num>N+" */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (isdigit(*s)) {saved_state = END_PSEUDO; state=START_INT;}      else errexit("Expected a digit after \"+\" at \"%c\"\n", *s);      break;    case END_PSEUDO:				/* Expect ')' */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = END_PSEUDO; state = SLASH;}      else if (*s == ')') {s++; state = AFTER_TYPE;}      else errexit("Illegal character \"%c\"\n", *s);      break;    case PSEUDO_NTH_O:				/* After ':nth_o' */      if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_NTH_OF;}      else errexit("Unknown pseudo-class \":nth_o%c...\"", *s);      break;    case PSEUDO_NTH_OF:				/* After ':nth_of' */      if (*s == '-') {s++; state = PSEUDO_NTH_OF_;}      else errexit("Unknown pseudo-class \":nth_of%c...\"", *s);      break;    case PSEUDO_NTH_OF_:			/* After ':nth_of_' */      if (*s == 't' || *s == 'T') {s++; state = PSEUDO_NTH_OF_T;}      else errexit("Unknown pseudo-class \":nth_of_%c...\"", *s);      break;    case PSEUDO_NTH_OF_T:			/* After ':nth_of_t' */      if (*s == 'y' || *s == 'Y') {s++; state = PSEUDO_NTH_OF_TY;}      else errexit("Unknown pseudo-class \":nth_of_t%c...\"", *s);      break;    case PSEUDO_NTH_OF_TY:			/* After ':nth_of_ty' */      if (*s == 'p' || *s == 'P') {s++; state = PSEUDO_NTH_OF_TYP;}      else errexit("Unknown pseudo-class \":nth_of_ty%c...\"", *s);      break;    case PSEUDO_NTH_OF_TYP:			/* After ':nth_of_typ' */      if (*s == 'e' || *s == 'E') {s++; state = PSEUDO_NTH_OF_TYPE;}      else errexit("Unknown pseudo-class \":nth_of_typ%c...\"", *s);      break;    case PSEUDO_NTH_OF_TYPE:			/* After :nth_of_type */      if (*s == '(') {s++; state = PSEUDO_NTH_OF_TYPE_;}      else errexit("Unknown pseudo-class \":nth_of_type%c...\"", *s);      break;    case PSEUDO_NTH_OF_TYPE_:			/* After :nth_of_type( */      sel->pseudos->type = NthChild; sel->pseudos->a = 0;      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = state; state = SLASH;}      else if (isdigit(*s)) {saved_state = AFTER_MUL; state = START_INT;}      else if (*s == '-') {s++; state = PSEUDO__MINUS;}      else if (*s == 'o' || *s=='O') {s++; state = PSEUDO__O;}      else if (*s == 'e' || *s=='E') {s++; state = PSEUDO__E;}      else if (*s == 'n' || *s=='N') {s++; sel->pseudos->a=1;state=AFTER_MUL_N;}      else errexit("Expected digit after \":nth-of_type(\" at \"%c\"\n",*s);      break;    case PSEUDO_F:				/* After ':f' */      if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_FI;}      else errexit("Unknown pseudo-class \":f%c...\"", *s);      break;    case PSEUDO_FI:				/* After ':fi' */      if (*s == 'r' || *s == 'R') {s++; state = PSEUDO_FIR;}      else errexit("Unknown pseudo-class \":fi%c...\"", *s);      break;    case PSEUDO_FIR:				/* After ':fir' */      if (*s == 's' || *s == 'S') {s++; state = PSEUDO_FIRS;}      else errexit("Unknown pseudo-class \":fir%c...\"", *s);      break;    case PSEUDO_FIRS:				/* After ':firs' */      if (*s == 't' || *s == 'T') {s++; state = PSEUDO_FIRST;}      else errexit("Unknown pseudo-class \":firs%c...\"", *s);      break;    case PSEUDO_FIRST:				/* After ':first' */      if (*s == '-') {s++; state = PSEUDO_FIRST_;}      else errexit("Unknown pseudo-class \":first%c...\"", *s);      break;    case PSEUDO_FIRST_:				/* After ':first_' */      if (*s == 'c' || *s == 'C') {s++; state = PSEUDO_FIRST_C;}      else if (*s == 'o') {s++; state = PSEUDO_FIRST_O;}      else errexit("Unknown pseudo-class \":first_%c...\"", *s);      break;    case PSEUDO_FIRST_C:			/* After ':first_c' */      if (*s == 'h' || *s == 'H') {s++; state = PSEUDO_FIRST_CH;}      else errexit("Unknown pseudo-class \":first_c%c...\"", *s);      break;    case PSEUDO_FIRST_CH:			/* After ':first_ch' */      if (*s == 'i' || *s == 'I') {s++; state = PSEUDO_FIRST_CHI;}      else errexit("Unknown pseudo-class \":first_ch%c...\"", *s);      break;    case PSEUDO_FIRST_CHI:			/* After ':first_chi' */      if (*s == 'l' || *s == 'L') {s++; state = PSEUDO_FIRST_CHIL;}      else errexit("Unknown pseudo-class \":first_chi%c...\"", *s);      break;    case PSEUDO_FIRST_CHIL:			/* After ':first_chil' */      if (*s != 'd' && *s != 'D') errexit("Unknown pseudo-class \":first_chil%c...\"", *s);      else {sel->pseudos->type = FirstChild; s++; state = PSEUDO_FIRST_CHILD;}      break;    case PSEUDO_FIRST_CHILD:			/* After ':first_child' */      if (!isnmchar(*s)) {state = AFTER_TYPE;}      else errexit("Unknown pseudo-class \":first_child%c...\"", *s);      break;    case PSEUDO_FIRST_O:			/* After ':first_o' */      if (*s == 'f' || *s == 'F') {s++; state = PSEUDO_FIRST_OF;}      else errexit("Unknown pseudo-class \":first_o%c...\"", *s);    case PSEUDO_FIRST_OF:			/* After ':first_of' */      if (*s == '-') {s++; state = PSEUDO_FIRST_OF_;}      else errexit("Unknown pseudo-class \":first_of%c...\"", *s);    case PSEUDO_FIRST_OF_:			/* After ':first_of_' */      if (*s == 't' || *s == 'T') {s++; state = PSEUDO_FIRST_OF_T;}      else errexit("Unknown pseudo-class \":first_of_%c...\"", *s);    case PSEUDO_FIRST_OF_T:			/* After ':first_of_t' */      if (*s == 'y' || *s == 'Y') {s++; state = PSEUDO_FIRST_OF_TY;}      else errexit("Unknown pseudo-class \":first_of_t%c...\"", *s);    case PSEUDO_FIRST_OF_TY:			/* After ':first_of_ty' */      if (*s == 'p' || *s == 'P') {s++; state = PSEUDO_FIRST_OF_TYP;}      else errexit("Unknown pseudo-class \":first_of_ty%c...\"", *s);    case PSEUDO_FIRST_OF_TYP:			/* After ':first_of_typ' */      if (*s == 'e' || *s == 'E') {s++; state = PSEUDO_FIRST_OF_TYPE;}      else errexit("Unknown pseudo-class \":first_of_typ%c...\"", *s);    case PSEUDO_FIRST_OF_TYPE:			/* After ':first_of_type' */      if (!isnmchar(*s)) {sel->pseudos->type = FirstOfType; state =AFTER_TYPE;}      else errexit("Unknown pseudo-class \":first_of_type%c...\"", *s);    case PSEUDO_L:				/* After ':l' */      if (*s == 'a' || *s == 'A') {s++; state = PSEUDO_LA;}      else errexit("Unknown pseudo-class \":l%c...\"", *s);      break;          case PSEUDO_LA:				/* After ':la' */      if (*s == 'n' || *s == 'N') {s++; state = PSEUDO_LAN;}      else errexit("Unknown pseudo-class \":la%c...\"", *s);      break;          case PSEUDO_LAN:				/* After ':lan' */      if (*s == 'g' || *s == 'G') {s++; state = PSEUDO_LANG;}      else errexit("Unknown pseudo-class \":lan%c...\"", *s);      break;          case PSEUDO_LANG:				/* After ':lang' */      if (*s == '(') {s++; state = PSEUDO_LANG_;}      else errexit("Unknown pseudo-class \":lang%c...\"", *s);      break;          case PSEUDO_LANG_:				/* After ':lang(' */      if (isspace(*s)) s++;      else if (*s == '/') {s++; saved_state = PSEUDO_LANG_; state = SLASH;}      else if (!isnmstart(*s)) errexit("Incorrect \":lang(\" at \"%c\"\n", *s);      else {	sel->pseudos->type = Lang;	sel->pseudos->s = newstring("");	strappc(&sel->pseudos->s, *s);	s++;	state = LANG;      }      break;    case LANG:					/* Inside a language code */      if (isnmchar(*s)) {strappc(&sel->pseudos->s, *s); s++;}      else state = END_PSEUDO;      break;    default:      assert(!"Cannot happen");    }  }  return sel;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -