Реферат: Препроцессор языка СИ

<span Courier New"">                       ‹ ¡®à â®à­ ïà ¡®â  1

<span Courier New"">

<span Courier New"">‡ ¤ ­¨¥:

<span Courier New"">

<span Courier New"">      ®áâநâì«¥ªá¨ç¥áª¨© ­ «¨§ â®à(᪠­¥à), ª®â®à멡㤥⠢

<span Courier New"">¤ «ì­¥©è¥¬¨á¯®«ì§®¢ âìáï¯à¨ à §¡®à¥HTML-¤®ªã¬¥­â®¢.

<span Courier New"">

<span Courier New"">’¥ªáâ¯à®£à ¬¬ë:

<span Courier New"">

<span Courier New"">#include<io.h>

<span Courier New"">#include<ctype.h>

<span Courier New"">#include<string.h>

<span Courier New"">#include<alloc.h>

<span Courier New"">

<span Courier New"">#include«parserhtm_cnst.h»

<span Courier New"">#include«parserhtm_glob.h»

<span Courier New"">#include«parserhtm_tokn.h»

<span Courier New"">#include«parserhtm_err.h»

<span Courier New"">#include«parse.h»

<span Courier New"">#pragma hdrstop

<span Courier New"">

<span Courier New"">extern YYSTYPEyylval;

<span Courier New"">enum {TEXT=0,PRE, KEYWORD, ATTR, AVALUE, IN_QUOTE};

<span Courier New"">char *states [ 6]= {«TEXT», «PRE», «KEYWORD», «ATTR»,«AVALUE», «IN_QUOTE»};

<span Courier New"">char *tktypes[10]= {"_OpenTag", "_CloseTag", "_EndTag","_C_KEYWORD",

<span Courier New"">                "_S_KEYWORD", "_A_KEYWORD", "_V_KEYWORD","_NUM",

<span Courier New"">                "_IDENTIFIER", "_QUOTED_ATTR"};

<span Courier New"">

<span Courier New"">/* text,preformatted text, HTML KEYWORD, attribute KEYWORD, */

<span Courier New"">/* attributevalue KEYWORD                          */

<span Courier New"">int in_close   = FALSE;

<span Courier New"">int in_open    = FALSE;

<span Courier New"">int opened_par =FALSE;

<span Courier New"">int state     = TEXT;

<span Courier New"">int old_state =TEXT;

<span Courier New"">int cUKSZ = 0;

<span Courier New"">

<span Courier New"">int USE_BUFFER =FALSE;

<span Courier New"">int lex_buff_size= 0;

<span Courier New"">typedef struct {

<span Courier New"">   int      tktyp;

<span Courier New"">   char tkval[NMSZ];

<span Courier New"">} tbuff;

<span Courier New"">tbufflex_buff[5];

<span Courier New"">

<span Courier New"">int  c;

<span Courier New"">int  lineno;

<span Courier New"">long charno;

<span Courier New"">long f_size;

<span Courier New"">int  icm;

<span Courier New"">               /*!!! */

<span Courier New"">charcomment[CMSZ];

<span Courier New"">               /*!!! */

<span Courier New"">

<span Courier New"">typedef struct {

<span Courier New"">    char name[TKSZ];

<span Courier New"">    int kw_token;

<span Courier New"">    int in_paragraph;

<span Courier New"">} kw_table;

<span Courier New"">

<span Courier New"">/**********functions declarations ************/

<span Courier New"">void fixfile(FILE*, char*);

<span Courier New"">int  nextchar(FILE *, FILE *);

<span Courier New"">void nlproc (FILE*);

<span Courier New"">int  bsearch (char *, kw_table *, int);

<span Courier New"">int  nexttok (char *);

<span Courier New"">void lexinit();

<span Courier New"">int  yylex();

<span Courier New"">/**********************************************/

<span Courier New"">

<span Courier New"">/* PossibleKEYWORDS — directives */

<span Courier New"">kw_tablekeyword_table[KWSZ] = {

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 2 -

<span Courier New"">

<span Courier New"">    {«A»,       _C_KEYWORD, TRUE  },

<span Courier New"">    // ...

<span Courier New"">    {«WBR»,    _S_KEYWORD, TRUE  }

<span Courier New"">};

<span Courier New"">

<span Courier New"">/* PossibleKEYWORDS — attributes */

<span Courier New"">kw_tableattr_table[ATSZ] = {

<span Courier New"">    {«ALIGN»,         _A_KEYWORD },

<span Courier New"">    // ...

<span Courier New"">    {«WRAP»,          _A_KEYWORD }

<span Courier New"">};

<span Courier New"">

<span Courier New"">/* PossibleKEYWORDS — attribute's values */

<span Courier New"">kw_tableaval_table[AVSZ] = {

<span Courier New"">    {«ABSBOTTOM»,   _V_KEYWORD },

<span Courier New"">    // ...

<span Courier New"">    {"_top",          _V_KEYWORD }

<span Courier New"">};

<span Courier New"">

<span Courier New"">/*

<span Courier New""> * ä㭪樨

<span Courier New""> */

<span Courier New"">

<span Courier New"">/*

<span Courier New""> * ”ã­ªæ¨ï¡¨­ à­®£® ¯®¨áª ¨¬¥­¨ ¢ â ¡«¨æ¥ ¨¬¥­.‚®§¢à é ¥â ¨­¤¥ªá

<span Courier New""> * ­ ©¤¥­­®£®í«¥¬¥­â  ¢¬ áᨢ¥ ¨«¨ -1, ¥á«¨­¨ç¥£® ­¥ ­ è« .

<span Courier New""> * Œ áᨢá®á⮨⠨§ § ¯¨á¥©á ¯®«ï¬¨: áâப®¢®©ASCII/Z-ª®­áâ ­âë -

<span Courier New""> * ª«î祢®£®á«®¢  HTML ¨ int'®¢áª®£®â¨¯  í⮣® KEYWORD' 

<span Courier New""> */

<span Courier New"">

<span Courier New"">int bsearch( charword[], kw_table word_table[], int tbsize)

<span Courier New"">{

<span Courier New"">  int low, high, middle;

<span Courier New"">  int i;

<span Courier New"">

<span Courier New"">  low = 0;

<span Courier New"">  high = tbsize — 1;

<span Courier New"">

<span Courier New"">  while (low <= high) {

<span Courier New"">    middle = (low + high) / 2;

<span Courier New"">    i = strcmp(word, word_table[middle].name);

<span Courier New"">    if (i < 0) {

<span Courier New"">      high = middle — 1;

<span Courier New"">    } else if (i > 0) {

<span Courier New"">      low = middle + 1;

<span Courier New"">    } else {

<span Courier New"">      return (middle);

<span Courier New"">    }

<span Courier New"">  }

<span Courier New"">

<span Courier New"">  return (-1);

<span Courier New"">}

<span Courier New"">

<span Courier New"">int nexttok(char*val)

<span Courier New"">{

<span Courier New"">  register int i, i2;

<span Courier New"">  char tokenvalue[NMSZ];

<span Courier New"">  int c1, tokentype, tokenend;

<span Courier New"">

<span Courier New"">  i = 0;

<span Courier New"">

<span Courier New"">  while (isspace(c)) /* c is always one charahead */ {

<span Courier New"">      if (c == 'n') nlproc(listfp);

<span Courier New"">      if (state == PRE) {

<span Courier New"">      tokenvalue[0] = c; tokenvalue[1] = '';

<span Courier New"">      tokentype = _IDENTIFIER;

<span Courier New"">      c = nextchar(infp, listfp); charno++;

<span Courier New"">      strcpy(val, tokenvalue);  return(tokentype);

<span Courier New"">      }

<span Courier New"">      c = nextchar(infp, listfp); charno++;

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 3 -

<span Courier New"">

<span Courier New"">  }

<span Courier New"">

<span Courier New"">  if ( ( (state == TEXT) || (state == PRE) )&& (c == '<') ) {

<span Courier New"">     ungetc(c1 = getc(infp), infp);

<span Courier New"">     old_state = state; state = KEYWORD;

<span Courier New"">     if (c1 == '/') {

<span Courier New"">      c = nextchar(infp, listfp); charno++;

      <span Courier New"">c = nextchar(infp, listfp); charno++;

<span Courier New"">      tokenvalue[0] = '<'; tokenvalue[1] ='/'; tokenvalue[2] = '';

<span Courier New"">      tokentype = _CloseTag; in_close = TRUE;in_open = FALSE;

<span Courier New"">      strcpy(val, tokenvalue);return(tokentype);

<span Courier New"">     } else {

<span Courier New"">      c = nextchar(infp, listfp); charno++;

<span Courier New"">      tokenvalue[0] = '<';  tokenvalue[1] = '';

<span Courier New"">      tokentype = _OpenTag;  in_close = FALSE; in_open = TRUE;

<span Courier New"">      strcpy(val, tokenvalue);return(tokentype);

<span Courier New"">     }

<span Courier New"">  }

<span Courier New"">  if (state == KEYWORD) {

<span Courier New"">

<span Courier New"">     if (c == '!') { /*  Comments! */

<span Courier New"">      while ((c != '>') && ( c != EOF)) {

<span Courier New"">         c= nextchar(infp, listfp); charno++;

<span Courier New"">      }

<span Courier New"">      state = ATTR;

<span Courier New"">      tokenvalue[0] = ''; tokentype =_IDENTIFIER;

<span Courier New"">      strcpy(val, tokenvalue);return(tokentype);

<span Courier New"">     }

<span Courier New"">

<span Courier New"">     while (isalnum(c)) {

<span Courier New"">      tokenvalue[i++] = toupper(c);

<span Courier New"">      c = nextchar(infp, listfp); charno++;

<span Courier New"">     }

<span Courier New"">     tokenvalue[i++] = '';

<span Courier New"">     if ((i = bsearch(tokenvalue,keyword_table, KWSZ)) >= 0) {

<span Courier New"">      tokentype = keyword_table[i].kw_token;

<span Courier New"">      state = ATTR;

<span Courier New"">      if ( strcmp(«PRE», tokenvalue)== 0 ) {

<span Courier New"">        if (in_close) old_state = TEXT;

<span Courier New"">        else      old_state = PRE;

<span Courier New"">      }

<span Courier New"">      strcpy(val, tokenvalue);return(tokentype);

<span Courier New"">     } else {

<span Courier New"">      if ((i = bsearch(tokenvalue, attr_table,ATSZ)) >= 0) {

<span Courier New"">         tokentype = attr_table[i].kw_token;

<span Courier New"">         state = AVALUE;

<span Courier New"">         strcpy(val, tokenvalue); return(tokentype);

<span Courier New"">      } else { /* Unknown attribute. Actually,it's much more easier   */

<span Courier New"">             /* just ignoring it in YACC then trying toskip it here*/

<span Courier New"">         tokentype = _IDENTIFIER;

<span Courier New"">         state = AVALUE;

<span Courier New"">         strcpy(val, tokenvalue); return(tokentype);

<span Courier New"">      }

<span Courier New"">

<span Courier New"">     }

<span Courier New"">  }

<span Courier New"">  if (state == IN_QUOTE) {

<span Courier New"">    if ( c == '"' ) {

<span Courier New"">       c = nextchar(infp, listfp); charno++;

<span Courier New"">       state = ATTR;

<span Courier New"">       tokenvalue[0] = '"';   tokenvalue[1] = '';

<span Courier New"">       tokentype = '"';

<span Courier New"">       strcpy(val, tokenvalue);return(tokentype);

<span Courier New"">    }

<span Courier New"">    tokentype = _QUOTED_ATTR;  /* maybe URL, maybe rain, maybe snow… */

<span Courier New"">    /* state = IN_QUOTE; */

<span Courier New"">    while ( c != '"' ) {

<span Courier New"">       tokenvalue[i++] = c;

<span Courier New"">       c = nextchar(infp, listfp);  charno++;

<span Courier New"">    }

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                 — 4 -

<span Courier New"">

<span Courier New"">    tokenvalue[i++] = '';

<span Courier New"">    /* c = nextchar(infp, listfp); Skip theclosing quotation mark */

<span Courier New"">    strcpy(val, tokenvalue); return(tokentype);

<span Courier New"">

<span Courier New"">  } /* end if for (state == IN_QUOTE) */

<span Courier New"">

<span Courier New"">  return 0; /* ’ ª®£® ­¥¬®¦¥â ¡ëâì… */

<span Courier New"">}

<span Courier New"">

<span Courier New"">int yylex()

<span Courier New"">{

<span Courier New"">  int tktyp;

<span Courier New"">  char tkval[NMSZ];

<span Courier New"">

<span Courier New"">  if (!USE_BUFFER) {

<span Courier New"">     tktyp = nexttok(tkval);

<span Courier New"">     switch (tktyp) {

<span Courier New"">      case _OpenTag: {

<span Courier New"">        tktyp = nexttok(tkval);

<span Courier New"">        if (opened_par) {

<span Courier New"">           if (tktyp == _C_KEYWORD || tktyp == _S_KEYWORD) {

<span Courier New"">             if (!keyword_table[bsearch(tkval,keyword_table, KW...

<span Courier New"">               lex_buff[0].tktyp = tktyp  ; strcpy(lex_buff[...

<span Courier New"">               lex_buff[1].tktyp = _OpenTag  ;strcpy(lex_buff[...

<span Courier New"">               lex_buff[2].tktyp = _EndTag   ;strcpy(lex_buff[...

<span Courier New"">               lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...

<span Courier New"">               lex_buff[4].tktyp = _CloseTag; strcpy(lex_buff[...

<span Courier New"">               lex_buff_size = 5; USE_BUFFER = TRUE;

<span Courier New"">               opened_par = (strcmp(tkval, «P»)==0);

<span Courier New"">             } else {

<span Courier New"">               lex_buff[0].tktyp = tktyp  ; strcpy(lex_buff[...

<span Courier New"">               lex_buff[1].tktyp = _OpenTag  ;strcpy(lex_buff[...

<span Courier New"">               lex_buff_size = 2; USE_BUFFER = TRUE;

<span Courier New"">             }

<span Courier New"">           }

<span Courier New"">         }else { // i.e. opened_par == FALSE

<span Courier New"">           opened_par = (strcmp(tkval, «P»)==0);

<span Courier New"">           lex_buff[0].tktyp = tktyp     ;strcpy(lex_buff[0].tkv...

<span Courier New"">           lex_buff[1].tktyp = _OpenTag  ;strcpy(lex_buff[1].tkv...

<span Courier New"">           lex_buff_size = 2; USE_BUFFER = TRUE;

<span Courier New"">         }

<span Courier New"">        break;

<span Courier New"">      }

<span Courier New"">

<span Courier New"">      case _CloseTag: {

<span Courier New"">        tktyp = nexttok(tkval);

<span Courier New"">        if (opened_par) {

<span Courier New"">           if (keyword_table[bsearch(tkval, keyword_table, KWSZ)]...

<span Courier New"">             lex_buff[0].tktyp = tktyp     ; strcpy(lex_buff[0]....

<span Courier New"">             lex_buff[1].tktyp = _CloseTag;strcpy(lex_buff[1]....

<span Courier New"">             lex_buff_size = 2; USE_BUFFER = TRUE;

<span Courier New"">           } else {

<span Courier New"">             if (strcmp(tkval, «P»)==0) {

<span Courier New"">               lex_buff[0].tktyp = tktyp  ; strcpy(lex_buff[...

<span Courier New"">               lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[...

<span Courier New"">               lex_buff_size = 2; USE_BUFFER = TRUE;

<span Courier New"">               opened_par = FALSE;

<span Courier New"">             } else {

<span Courier New"">               lex_buff[0].tktyp = tktyp  ; strcpy(lex_buff[...

<span Courier New"">               lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[...

<span Courier New"">               lex_buff[2].tktyp = _EndTag   ;strcpy(lex_buff[...

<span Courier New"">               lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...

<span Courier New"">               lex_buff[4].tktyp = _CloseTag; strcpy(lex_buff[...

<span Courier New"">               lex_buff_size = 5; USE_BUFFER =TRUE;

<span Courier New"">               opened_par = FALSE;

<span Courier New"">             }

<span Courier New"">           }

<span Courier New"">         }else {

<span Courier New"">           lex_buff[0].tktyp = tktyp     ;strcpy(lex_buff[0].tkv...

<span Courier New"">           lex_buff[1].tktyp = _CloseTag; strcpy(lex_buff[1].tkv...

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                 — 5 -

<span Courier New"">

<span Courier New"">           lex_buff_size = 2; USE_BUFFER = TRUE;

<span Courier New"">         }

<span Courier New"">

<span Courier New"">        break;

<span Courier New"">      }

<span Courier New"">

<span Courier New"">      case _IDENTIFIER: {

<span Courier New"">        if ( !(in_open || in_close) && (!opened_par)) {

<span Courier New"">           lex_buff[0].tktyp = _IDENTIFIER; strcpy(lex_buff[0].tkv...

<span Courier New"">           lex_buff[1].tktyp = _EndTag    ;strcpy(lex_buff[1].tkv...

<span Courier New"">           lex_buff[2].tktyp = _C_KEYWORD; strcpy(lex_buff[2].tkv...

<span Courier New"">           lex_buff[3].tktyp = _OpenTag   ;strcpy(lex_buff[3].tkv...

<span Courier New"">           lex_buff_size = 4; USE_BUFFER = TRUE;

<span Courier New"">           opened_par = TRUE;

<span Courier New"">         }

      <span Courier New"">  break;

<span Courier New"">      }

<span Courier New"">

<span Courier New"">      case 0: { // EOF

<span Courier New"">        if (opened_par) {

<span Courier New"">           lex_buff[0].tktyp = tktyp      ;strcpy(lex_buff[0].tkv...

<span Courier New"">           lex_buff[1].tktyp = _EndTag    ;strcpy(lex_buff[1].tkv...

<span Courier New"">           lex_buff[2].tktyp = _C_KEYWORD; strcpy(lex_buff[2].tkv...

<span Courier New"">           lex_buff[3].tktyp = _CloseTag  ;strcpy(lex_buff[3].tkv...

<span Courier New"">           lex_buff_size = 4; USE_BUFFER = TRUE;

<span Courier New"">           opened_par = TRUE;

<span Courier New"">         }

<span Courier New"">      }

<span Courier New"">

<span Courier New"">     }

<span Courier New"">  }

<span Courier New"">

<span Courier New"">  if (USE_BUFFER) {

<span Courier New"">         tktyp = lex_buff[--lex_buff_size].tktyp;

<span Courier New"">     strcpy(tkval,  lex_buff[ lex_buff_size].tkval);

<span Courier New"">     if (lex_buff_size == 0) USE_BUFFER =FALSE;

<span Courier New"">  }

<span Courier New"">

<span Courier New"">  yylval.pchar = (char *) malloc(1 +strlen(tkval));

<span Courier New"">  strcpy(yylval.pchar, tkval);

<span Courier New"">  return(tktyp);

<span Courier New"">}

<span Courier New"">

<span Courier New"">à¨¬¥ç ­¨¥:à á¯¥ç âª¨ä ©«®¢ htm_cnst.h, htm_glob.h, htm_tokn.h ¨

<span Courier New"">         htm_err.h á¬. ¢ ¯à¨«®¦¥­¨¨ €apendix'  4.4.

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 6 -

<span Courier New"">

<span Courier New"">                       ‹ ¡®à â®à­ ïà ¡®â  2

<span Courier New"">

<span Courier New"">‡ ¤ ­¨¥:

<span Courier New"">       ®áâநâìä®à¬ â¨§ â®à‘-ä ©«®¢. ¥®¡å®¤¨¬®à¥ «¨§®¢ âì

<span Courier New"">á«¥¤ãî騥ä㭪樨:

<span Courier New"">   -  `{`- ¢á¥£¤  c ­®¢®©áâப¨ ¡¥§®âáâ㯠

<span Courier New"">   -  `{`- ­¨ª®£¤  ­¥¯¥à¥­®á¨âáï

<span Courier New"">   -  `{`- ¢á¥£¤  c ­®¢®©áâப¨ á®âáâ㯮¬

<span Courier New"">   -  0-  ¢áâ ¢«ïâìᨬ¢®« TAB ¯à¨ ®âáâ㯥

<span Courier New"">   - 1..8 ¢áâ ¢«ïâì x¯à®¡¥«®¢

<span Courier New"">   - ä®à¬ â¨à®¢ â쪮¬¬¥­â à¨¨ c xx ¯® yy¯®§¨æ¨¨

<span Courier New"">   - ­¥áª®«ìª® ª®¬ ­¤ ­  ®¤­®©áâப¥

<span Courier New"">   -  `=`¢ë¤¥«ïâì¯à®¡¥« ¬¨

<span Courier New"">

<span Courier New"">’¥ªáâ¯à®£à ¬¬ë:

<span Courier New"">#include<stdio.h>

<span Courier New"">#include<dos.h>

<span Courier New"">#include<ctype.h>

<span Courier New"">#include<string.h>

<span Courier New"">

<span Courier New"">#define ERROR       0

<span Courier New"">#define IDENT       1

<span Courier New"">#defineKEYWORD   2

<span Courier New"">#defineBRACKETS  3

<span Courier New"">#define OTHER       4

<span Courier New"">#define BEGIN       '{'

<span Courier New"">#define END  '}'

<span Courier New"">#define COMMA       ','

<span Courier New"">#define SEMI       ';'

<span Courier New"">#define LB    'n'

<span Courier New"">

<span Courier New"">char val[100];

<span Courier New"">charcomment[200];

<span Courier New"">

<span Courier New"">int  pos=0;

<span Courier New"">int  undo;

<span Courier New"">int  backspace;

<span Courier New"">

<span Courier New"">#define N_KW 8

<span Courier New"">charkeywords[N_KW][20]={

<span Courier New"">   «for»,

<span Courier New"">   «while»,

<span Courier New"">   «do»,

<span Courier New"">   «if»,

<span Courier New"">   «switch»,

<span Courier New"">   «else»,

<span Courier New"">   «case»,

<span Courier New"">   «default»};

<span Courier New"">

<span Courier New"">//-----------------------------------------------------------------

<span Courier New"">void blockQuote(char *(&s),FILE *f)

<span Courier New"">{

<span Courier New"">   char c=fgetc(f);

<span Courier New"">

<span Courier New"">   *(s++)=c, c=0;

<span Courier New"">   while (c!=''' && c!='"') {

<span Courier New"">      c=*(s++)=fgetc(f);

<span Courier New"">      if (c=='\')

<span Courier New"">       c=*(s++)=fgetc(f);

<span Courier New"">   }

<span Courier New"">}

<span Courier New"">//-----------------------------------------------------------------

<span Courier New"">int getNext (FILE*f)

<span Courier New"">{

<span Courier New"">   char *s=val,c;

<span Courier New"">   int      buf=undo;

<span Courier New"">   static int symbol=0;

<span Courier New"">   static int startPos=1;

<span Courier New"">

<span Courier New"">   c=fgetc(f);

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 7 -

<span Courier New"">

<span Courier New"">   startPos=0;

<span Courier New"">   if (isalnum(c) || c=='_') {

<span Courier New"">      symbol=0;

<span Courier New"">      *(s++)=c;

<span Courier New"">      while ((isalnum(c) || c=='_' || c=='.')&& !feof(f) && !isspace(c))

<span Courier New"">       c=*(s++)=fgetc(f);

<span Courier New"">      ungetc (c,f);

<span Courier New"">      *(--s)=0;

<span Courier New"">      for (int i=0;i<N_KW &&strcmp(keywords[i],val);i++);

<span Courier New"">      if (i!=N_KW) *(s++)=' ';

<span Courier New"">      *s=0;

<span Courier New"">      if (i!=N_KW) return KEYWORD;

<span Courier New"">      return IDENT;

<span Courier New"">   }

<span Courier New"">

<span Courier New"">   if (c==''' || c=='"') {

<span Courier New"">      symbol=0;

<span Courier New"">      ungetc(c,f);

<span Courier New"">      blockQuote (s,f);

<span Courier New"">      *s=0;

<span Courier New"">      return IDENT;

<span Courier New"">   }

<span Courier New"">

<span Courier New"">   if (c=='=' && E && !symbol)

<span Courier New"">   {

<span Courier New"">      *(s++)=' ';

<span Courier New"">      *(s++)=c;

<span Courier New"">      *(s++)=' ';

<span Courier New"">      *s=0;

<span Courier New"">      return OTHER;

<span Courier New"">   }

<span Courier New"">

<span Courier New"">   *s=c, *(s+1)=0;

<span Courier New"">   symbol=1;

<span Courier New"">   return OTHER;

<span Courier New"">}

<span Courier New"">

<span Courier New"">void outVal (FILE*f,int back=0)

<span Courier New"">{

<span Courier New"">   char *s=val;

<span Courier New"">

<span Courier New"">   if (backspace && !back)

<span Courier New"">   if (!T) {

<span Courier New"">      fputc (9,f);

<span Courier New"">      pos+=F3;

<span Courier New"">   }

<span Courier New"">   else {

<span Courier New"">      for (int j=0;j<T;j++)

<span Courier New"">      {

<span Courier New"">       fputc (' ',f);

<span Courier New"">       pos++;

<span Courier New"">      }

<span Courier New"">   }

<span Courier New"">   backspace=0;

<span Courier New"">   while (*s) {

<span Courier New"">      fputc (*(s++),f);

<span Courier New"">      pos++;

<span Courier New"">   }

<span Courier New"">}

<span Courier New"">

<span Courier New"">void outCR (FILE*f,int tab,int newLine=0)

<span Courier New"">{

<span Courier New"">   int limit=tab-1+newLine;

<span Courier New"">

<span Courier New"">   // Out Comments

<span Courier New"">   if (*comment)

<span Courier New"">      outComment (f);

<span Courier New"">   if (!newLine) {

<span Courier New"">       fputc ('n',f);

<span Courier New"">       pos=0;

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 8 -

<span Courier New"">

<span Courier New"">   }

<span Courier New"">   for (int i=0;i<limit;i++)

<span Courier New"">   {

<span Courier New"">      if (!T) {

<span Courier New"">       fputc (9,f);

<span Courier New"">       pos+=F3;

<span Courier New"">      }

<span Courier New"">      else {

<span Courier New"">       for(int j=0;j<T;j++)  {

<span Courier New"">         fputc (' ',f);

<span Courier New"">         pos++;

<span Courier New"">       }

<span Courier New"">      }

<span Courier New"">   }

<span Courier New"">   if (tab && !newLine)

<span Courier New"">      backspace=1;

<span Courier New"">}

<span Courier New"">//-----------------------------------------------------------------

<span Courier New"">

<span Courier New"">int format (FILE*f_in,FILE *f_out)

<span Courier New"">{

<span Courier New"">   int      tab=0,tab1=0,tab2=0,lb=0;

<span Courier New"">   int      lex;

<span Courier New"">

<span Courier New"">   while (!feof(f_in))

<span Courier New"">   {

<span Courier New"">      lex=getNext(f_in);

<span Courier New"">      switch (lex) {

<span Courier New"">       case KEYWORD: {

<span Courier New"">         lb=0;

<span Courier New"">         outVal (f_out);

<span Courier New"">         lex=getNext(f_in);

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case BEGIN: {

<span Courier New"">         tab1=0;

<span Courier New"">         if (!lb && N!=2) outCR (f_out,tab);

<span Courier New"">         if (N==3) outCR (f_out,1,1);

<span Courier New"">         outVal(f_out);

<span Courier New"">         outCR (f_out,++tab);

<span Courier New"">         lb=1;

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case END: {

<span Courier New"">         if (!lb) outCR (f_out,tab);

<span Courier New"">         lb=1;

<span Courier New"">         tab1=0;

<span Courier New"">         lex=getNext (f_in);

<span Courier New"">         if (lex==LB) lex=getNext(f_in);

<span Courier New"">         undo=lex;

<span Courier New"">         outCR (f_out,tab);

<span Courier New"">         lb=1;

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case SEMI: {

<span Courier New"">         lb=0;

<span Courier New"">         tab1=0;

<span Courier New"">         outVal (f_out);

<span Courier New"">         lex=getNext(f_in);

<span Courier New"">         undo=lex;

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case IDENT: {

<span Courier New"">         lb=0;

<span Courier New"">         outVal (f_out);

<span Courier New"">         lex=getNext (f_in);

<span Courier New"">         undo=lex;

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case LB: {

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 9 -

<span Courier New"">

<span Courier New"">         int used;

<span Courier New"">

<span Courier New"">         tab1=0;

<span Courier New"">         if (*comment) {

<span Courier New"">            outCR (f_out,tab);

<span Courier New"">            used=1;

<span Courier New"">         }

<span Courier New"">         lex=getNext (f_in);

<span Courier New"">         if (N!=2 || lex!=BEGIN) {

<span Courier New"">            if (!used) outCR (f_out,tab);

<span Courier New"">            lb=1;

<span Courier New"">         }

<span Courier New"">         undo=lex;

<span Courier New"">         break;

<span Courier New"">       }

<span Courier New"">       case EOF:

<span Courier New"">         return 1;

<span Courier New"">       default: {

<span Courier New"">         lb=0;

<span Courier New"">         outVal(f_out);

<span Courier New"">       }

<span Courier New"">      }

<span Courier New"">   }

<span Courier New"">

<span Courier New"">   return 1;

<span Courier New"">}

<span Courier New"">

<span Courier New"">à¨¬¥ç ­¨¥:¥®¡å®¤¨¬ë¥ ä㭪樨¡ë«¨ ॠ«¨§®¢ ­ë ¢¯®«­®¬ ®¡ê¥¬¥

<span Courier New"">         ¨ ¯à¨ ᤠ祭 à¥ª ­¨© ­¥ ¢ë§¢ «¨.(’¥áâ®¢ë© ¯à¨¬¥à

<span Courier New"">         ¯à¨¢¥¤¥­ ¢¯à¨«®¦¥­¨¨  apendix'  4.5)

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New"">

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 10 -

<span Courier New"">

<span Courier New"">                       ‹ ¡®à â®à­ ïà ¡®â  3

<span Courier New"">

<span Courier New"">‡ ¤ ­¨¥:

<span Courier New"">

<span Courier New"">à® ­ «¨§¨®¢ âìåä ¨ ¢ë¡ âì«ãçèãî ¤«ïá«ãç ©­®£® à á¯¥¤¥«¥­¨ï¨¤-®¢

<span Courier New"">

<span Courier New"">Ž¡®¡é¥­­ ï䮬㫠 ¢ëç¨á«¥­¨ïåä:

<span Courier New"">

<span Courier New"">h0 = 0;

<span Courier New"">h(i) = Alf*h(i-1) [+] C(i), i=1..k

<span Courier New"">k — ¤«¨­  áâப¨. [+] — ­¥ª®â® ï¯à®¨§¢®«ì­ ï®¯¥à æ¨ï

<span Courier New"">                    (+, -, <<, _rotl, ^ |, &)

<span Courier New"">                   

<span Courier New"">à® ­ «¨§¨®¢ âìí⨠¨ «î¡ë¥¤à㣨¥ åä ­ ª®«¨ç¥á⢮ ª®««¨§¨©(ª®­ä«¨ªâ®¢)

<span Courier New"">¤«ï­¥ª®â®àëåá«ãç ©­ë寮᫥¤®¢ â¥«ì­®áâì. ¯à¨¬¥à:

<span Courier New"">1) id'ëï§ëª  C (¤®   50).

<span Courier New"">2) — "" — (¤®  100).

<span Courier New"">3) — "" — (¤® 1000).

<span Courier New"">4)‚­¥è­¨¥ ¨¬¥­ áâ ­¤ â­®©¡¨¡«®¨®â⥪¨ BC++.

<span Courier New"">5)‚­¥è­¨¥ ¨¬¥­ £ ä¨ç¥áª®©¡¨¡«¨®â¥ª¨ BC++.

<span Courier New"">6)‘«ãç ©­® £¥­¥¨ã¥¬ë¥¨¬¥­  (~600)

<span Courier New"">7)€­£«¨©áª¨¥ áá«®¢ á ¯¥ä¨ªá ¬¨ ¨/¨«¨áãä䨪ᠬ¨ (xxx) — ®ª®«®200

<span Courier New"">8) 300¨¬¥­ ¢¨¤ : w000, w001, w002, etc

<span Courier New"">€­ «¨§áâ â¨á⨪¨á¢¥á⨠¢â ¡«¨æã/£à ä¨ª

<span Courier New"">

<span Courier New"">

<span Courier New"">’¥ªá¯à®£à ¬¬ë ­ «¨§ â®à :

<span Courier New"">#include<stdio.h>

<span Courier New"">#include<stdlib.h>

<span Courier New"">

<span Courier New"">unsignedhash_shift(char *s)

<span Courier New"">{

<span Courier New"">   unsigned hash = 0;

<span Courier New"">

<span Courier New"">   while (*s)

<span Courier New"">      hash = (hash << 1) + *s++;

<span Courier New"">   return hash;

<span Courier New"">}

<span Courier New"">

<span Courier New"">unsignedhash_rotl(char *s)

<span Courier New"">{

<span Courier New"">   unsigned hash = 0;

<span Courier New"">

<span Courier New"">   while (*s)

<span Courier New"">      hash = _rotl(hash,1) ^ *s++;

<span Courier New"">   return hash;

<span Courier New"">}

<span Courier New"">

<span Courier New"">longhash_pgw(char *s)

<span Courier New"">{

<span Courier New"">   char *p;

<span Courier New"">   unsigned long h = 0, g;

<span Courier New"">

<span Courier New"">   for(p=s;*p;p++)

<span Courier New"">   {

<span Courier New"">      h = (h << 4) +  *p;

<span Courier New"">      if(g = h & 0xF0000000)

<span Courier New"">      {

<span Courier New"">       h =h^(g >>24);

<span Courier New"">       h =h^g;

<span Courier New"">      }

<span Courier New"">   }

<span Courier New"">   return h;

<span Courier New"">}

<span Courier New"">

<span Courier New"">unsigned hash_4(char *s)

<span Courier New"">{

<span Courier New"">   unsigned h = 0;

<span Courier New"">   const D=5;

<span Courier New"">

<span Courier New";mso-fareast-font-family: Calibri;mso-fareast-theme-font:minor-latin;mso-ansi-language:RU;mso-fareast-language: EN-US;mso-bidi-language:AR-SA">

<span Courier New"">

<span Courier New"">                                — 11 -

<span Courier New"">

<span Courier New"">   while (*s)

<span Courier New"">      h = D*h + *s++;

<span Courier New"">   return h;

<span Courier New"">}

<span Courier New"">

<span Courier New"">main (intargc,char **argv)

<span Courier New"">{

<span Courier New"">   int n=0,total=0;

<span Courier New"">   int placed1=0,placed2=0,placed3=0,placed4=0;

<span Courier New"">   int max1=0,max2=0,max3=0,max4=0;

<span Courier New"">   int *table1,*table2,*table3,*table4;

<span Courier New"">   FILE *f;

<span Courier New"">   char buf[100];

<span Courier New"">

<span Courier New"">   puts("‹ ¡®à â®à­ ïà ¡®â  3.ˆáá«¥¤®¢ ­¨¥åíè-ä㭪樨.");

<span Courier New"">   puts ("‹ï¯ã­®¢ˆ.‚.                   €-61");

<span Courier New"">

<span Courier New"">   if (argc<3)

<span Courier New"">   {

<span Courier New"">      puts («n  HASH.COM <file_name>»);

<span Courier New"">      puts ("        n — ç¨á«® í«¥¬¥­â®¢ ¢â ¡«¨æ¥");

<span Courier New"">      puts ("        file_name — ¨¬ï ä ©«  ᨤ¥­â¨ä¨ª â®à ¬¨ n");

<span Courier New"">      return 0;

<span Courier New"">   }

<span Courier New"">   n=atoi(argv[1]);

<span Courier New"">   if (n<10)

<span Courier New"">   {

<span Courier New"">      puts («n ‘«¨èª®¬¬ «¥­ìª ïâ ¡«¨æ  n»);

<span Courier New"">      return 0;

<span Courier New"">   }

<span Courier New"">   table1=(int*)calloc(n,sizeof(int));

<span Courier New"">   table2=(int*)calloc(n,sizeof(int));

<span Courier New"">   table3=(int*)calloc(n,sizeof(int));

<span Courier New"">   table4=(int*)calloc(n,sizeof(int));

<span Courier New"">   if (!table1 || !table2 || !table3 ||!table4)

<span Courier New"">   {

<span Courier New"">      puts («n¥å¢ â ¥â ¯ ¬ï⨤«ï â ¡«¨æn»);

<span Courier New"">      return 0;

<span Courier New"">   }

<span Courier New"">   if ((f=fopen(argv[2],«r»))==NULL)

<span Courier New"">   {

<span Courier New"">      puts («n¥¬®£ã ®âªàëâì㪠§ ­­ë© ä ©«n»);

<span Courier New"">      return 0;

<span Courier New"">   }

<span Courier New"">

<span Courier New"">   while (!feof(f))

<span Courier New"">      if (fscanf (f,"%s",buf)==1)

</p
еще рефераты
Еще работы по программированию, базе данных