зеркало из https://github.com/mozilla/gecko-dev.git
119 строки
4.0 KiB
Plaintext
119 строки
4.0 KiB
Plaintext
@! This file is used to generate pa_hash.c. A perl script merges this
|
|
@! file with the output of gperf to produce the hash functions for
|
|
@! tag lookup. Lines starting with @! are comments. Lines which do
|
|
@! not being with @! are copied straight to the output file. "@begin NAME
|
|
@! /REGEX1/ /REGEX2/" means to skip lines in the input until REGEX1 is
|
|
@! matched, and then begin saving output under name NAME, and stop when
|
|
@! REGEX2 is matched. "@include NAME" inserts the data saved as "NAME".
|
|
@! "@SUB NAME SUBREGEX" performs a substitution on the data saved in NAME.
|
|
@!
|
|
@! Comments and compaints about this go to Michael Toy.
|
|
@!
|
|
@! The following goop extracts the parts we need from the generated output
|
|
@! of gperf. We later merge that goop with custom code to generate
|
|
@! the tag lookup function.
|
|
@!
|
|
@begin MACROS /#define/ /^$/
|
|
@begin HASH_TABLE /static unsigned [a-z]+ (asso_values|hash_table)/ /};/
|
|
@begin HASH_FUNC /register int hval = len;/ /return hval/
|
|
@sub HASH_FUNC /return hval \+/hval +=/
|
|
@sub HASH_FUNC /str\[/MYLOWER(str[/
|
|
@sub HASH_FUNC /]]/])]/
|
|
@begin LENGTH_TABLE /static unsigned char lengthtable/ /};/
|
|
@begin TAG_TABLE /static struct pa_TagTable *wordlist/ /};/
|
|
@!
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/*
|
|
** This is a generated file, do not edit it. If you need to make changes,
|
|
** edit the file pa_hash.template and re-build pa_hash.c on a UNIX machine.
|
|
** This whole hacky thing was done by Michael Toy.
|
|
*/
|
|
|
|
#include "pa_parse.h"
|
|
@include MACROS
|
|
#define MYLOWER(x) TOLOWER(((x) & 0x7f))
|
|
|
|
/*************************************
|
|
* Function: pa_tokenize_tag
|
|
*
|
|
* Description: This function maps the passed in string
|
|
* to one of the valid tag element tokens, or to
|
|
* the UNKNOWN token.
|
|
*
|
|
* Params: Takes a \0 terminated string.
|
|
*
|
|
* Returns: a 32 bit token to describe this tag element. On error,
|
|
* which means it was not passed an unknown tag element string,
|
|
* it returns the token P_UNKNOWN.
|
|
*
|
|
* Performance Notes:
|
|
* Profiling on mac revealed this routine as a big (5%) time sink.
|
|
* This function was stolen from pa_mdl.c and merged with the perfect
|
|
* hashing code and the tag comparison code so it would be flatter (fewer
|
|
* function calls) since those are still expensive on 68K and x86 machines.
|
|
*************************************/
|
|
|
|
intn
|
|
pa_tokenize_tag(char *str)
|
|
{
|
|
@include HASH_TABLE
|
|
@include LENGTH_TABLE
|
|
@include TAG_TABLE
|
|
|
|
if (str != NULL)
|
|
{
|
|
int len = strlen(str);
|
|
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
|
{
|
|
@include HASH_FUNC
|
|
@! "hval" now contains hash value
|
|
if (hval <= MAX_HASH_VALUE && hval >= MIN_HASH_VALUE)
|
|
{
|
|
if (len == lengthtable[hval])
|
|
{
|
|
register char *tag = wordlist[hval].name;
|
|
/*
|
|
** The following code was stolen from pa_TagEqual,
|
|
** again to make this function flatter.
|
|
*/
|
|
|
|
/*
|
|
** While not at the end of the string, if they ever differ
|
|
** they are not equal. We know "tag" is already lower case.
|
|
*/
|
|
while ((*tag != '\0')&&(*str != '\0'))
|
|
{
|
|
if (*tag != (char) TOLOWER(*str))
|
|
return(P_UNKNOWN);
|
|
tag++;
|
|
str++;
|
|
}
|
|
/*
|
|
** One of the strings has ended, if they are both ended, then they
|
|
** are equal, otherwise not.
|
|
*/
|
|
if ((*tag == '\0')&&(*str == '\0'))
|
|
return wordlist[hval].id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return(P_UNKNOWN);
|
|
}
|