 |
ÍÀÓ×ÍÀß ÁÈÁËÈÎÒÅÊÀ - ÐÅÔÅÐÀÒÛ - Ïðåïðîöåññîð ÿçûêà ÑÈ
Ïðåïðîöåññîð ÿçûêà ÑÈ
Èññëåäîâàíèå õô
Ïîàíàëèçèîâàòü õô è âûáàòü ëó÷øóþ äëÿ ñëó÷àéíîãî àñïåäåëåíèÿ èä-îâ
Îáîáùåííàÿ ôîìóëà âû÷èñëåíèÿ õô:
h0 = 0;
h(i) = Alf* h(i-1) [+] C(i), i=1..k
k - \äëèíà ñòîêè. [+] - íåêîòîàÿ ïîèçâîëüíàÿ îïåàöèÿ (+, -,
Ãîñóäàðñòâåííûé
êîìèòåò ïî äåëàì íàóêè è âûñøåé øêîëû ÐÔ
Ìîñêîâñêèé
Ãîñóäàðñòâåííûé Èíñòèòóò Ýëåêòðîíèêè è Ìàòåìàòèêè
(òåõíè÷åñêèé
óíèâåðñèòåò)
Êàôåäðà ÈÒÀÑ
Êóðñîâàÿ
ðàáîòà
ïî òåìå
«Ïðåïðîöåññîð
ÿçûêà Ñè»
Ñòóäåíòû:
Êàçàêîâ
Ñ.Â.
Íèêóëèí
Ì.Ë.
Êóñòîâ
Ä.À.
Áåáÿêèí
Ñ.Å.
Ðóêîâîäèòåëü:
Ñàôèí Ò.Ò.
Ìîñêâà, 1997
Çàäàíèå:
Ðàçðàáîòàòü
ïðîãðàììó, ðåàëèçóþùóþ ïðåïðîöåññîð ÿçûêà Ñè.
Ëàáîðàòîðíàÿ ðàáîòà 1
Çàäàíèå:
Ïîñòðîèòü ëåêñè÷åñêèé àíàëèçàòîð (ñêàíåð),
êîòîðûé áóäåò â
äàëüíåéøåì
èñïîëüçîâàòüñÿ ïðè ðàçáîðå HTML-äîêóìåíòîâ.
Òåêñò
ïðîãðàììû:
#include
<io.h>
#include
<ctype.h>
#include
<string.h>
#include
<alloc.h>
#include
"parser\htm_cnst.h"
#include
"parser\htm_glob.h"
#include
"parser\htm_tokn.h"
#include
"parser\htm_err.h"
#include
"parse.h"
#pragma
hdrstop
extern
YYSTYPE yylval;
enum
{TEXT=0, PRE, KEYWORD, ATTR, AVALUE, IN_QUOTE};
char
*states [ 6] = {"TEXT", "PRE", "KEYWORD",
"ATTR", "AVALUE", "IN_QUOTE"};
char
*tktypes[10] = {"_OpenTag", "_CloseTag",
"_EndTag", "_C_KEYWORD",
"_S_KEYWORD", "_A_KEYWORD", "_V_KEYWORD",
"_NUM",
"_IDENTIFIER", "_QUOTED_ATTR"};
/*
text, preformatted text, HTML KEYWORD, attribute KEYWORD, */
/*
attribute value KEYWORD */
int
in_close = FALSE;
int
in_open = FALSE;
int
opened_par = FALSE;
int
state = TEXT;
int
old_state = TEXT;
int
cUKSZ = 0;
int
USE_BUFFER = FALSE;
int
lex_buff_size = 0;
typedef
struct {
int tktyp;
char tkval[NMSZ];
}
tbuff;
tbuff
lex_buff[5];
int c;
int lineno;
long
charno;
long
f_size;
int icm;
/* !!!!!! */
char
comment[CMSZ];
/* !!!!!! */
typedef
struct {
char name[TKSZ];
int
kw_token;
int
in_paragraph;
}
kw_table;
/**********
functions declarations ************/
void
fixfile(FILE *, char*);
int nextchar(FILE *, FILE *);
void
nlproc (FILE *);
int bsearch (char *, kw_table *, int);
int nexttok (char *);
void
lexinit();
int yylex();
/**********************************************/
/*
Possible KEYWORDS - directives */
kw_table
keyword_table[KWSZ] = {
- 2 -
{"A", _C_KEYWORD, TRUE },
// ...
{"WBR", _S_KEYWORD, TRUE }
};
/*
Possible KEYWORDS - attributes */
kw_table
attr_table[ATSZ] = {
{"ALIGN", _A_KEYWORD },
// ...
{"WRAP", _A_KEYWORD }
};
/*
Possible KEYWORDS - attribute's values */
kw_table
aval_table[AVSZ] = {
{"ABSBOTTOM", _V_KEYWORD },
// ...
{"_top", _V_KEYWORD }
};
/*
* ôóíêöèè
*/
/*
* Ôóíêöèÿ áèíàðíîãî ïîèñêà èìåíè â òàáëèöå
èìåí. Âîçâðàùàåò èíäåêñ
* íàéäåííîãî ýëåìåíòà â ìàññèâå èëè -1, åñëè
íè÷åãî íå íàøëà.
* Ìàññèâ ñîñòîèò èç çàïèñåé ñ ïîëÿìè :
ñòðîêîâîé ASCII/Z-êîíñòàíòû -
* êëþ÷åâîãî ñëîâà HTML è int'îâñêîãî òèïà
ýòîãî KEYWORD'à
*/
int
bsearch( char word[], kw_table word_table[], int tbsize)
{
int low, high, middle;
int i;
low = 0;
high = tbsize - 1;
while (low <= high) {
middle = (low + high) / 2;
i = strcmp(word, word_table[middle].name);
if (i < 0) {
high = middle - 1;
} else if (i > 0) {
low = middle + 1;
} else {
return (middle);
}
}
return (-1);
}
int
nexttok(char *val)
{
register int i, i2;
char tokenvalue[NMSZ];
int c1, tokentype, tokenend;
i = 0;
while (isspace(c)) /* c is always one char
ahead */ {
if (c == '\n') nlproc(listfp);
if (state == PRE) {
tokenvalue[0] = c; tokenvalue[1] = '\0';
tokentype = _IDENTIFIER;
c = nextchar(infp, listfp); charno++;
strcpy(val, tokenvalue); return(tokentype);
}
c = nextchar(infp, listfp); charno++;
- 3 -
}
if ( ( (state == TEXT) || (state == PRE) )
&& (c == '<') ) {
ungetc(c1 = getc(infp), infp);
old_state = state; state = KEYWORD;
if (c1 == '\/') {
c = nextchar(infp, listfp); charno++;
c = nextchar(infp, listfp);
charno++;
tokenvalue[0] = '<'; tokenvalue[1] =
'\/'; tokenvalue[2] = '\0';
tokentype = _CloseTag; in_close = TRUE;
in_open = FALSE;
strcpy(val, tokenvalue);
return(tokentype);
} else {
c = nextchar(infp, listfp); charno++;
tokenvalue[0] = '<'; tokenvalue[1] = '\0';
tokentype = _OpenTag; in_close = FALSE; in_open = TRUE;
strcpy(val, tokenvalue);
return(tokentype);
}
}
if (state == KEYWORD) {
if (c == '\!') { /* Comments! */
while ((c != '>') && ( c != EOF
)) {
c = nextchar(infp, listfp); charno++;
}
state = ATTR;
tokenvalue[0] = '\0'; tokentype =
_IDENTIFIER;
strcpy(val, tokenvalue);
return(tokentype);
}
while (isalnum(c)) {
tokenvalue[i++] = toupper(c);
c = nextchar(infp, listfp); charno++;
}
tokenvalue[i++] = '\0';
if ((i = bsearch(tokenvalue,
keyword_table, KWSZ)) >= 0) {
tokentype = keyword_table[i].kw_token;
state = ATTR;
if ( strcmp("PRE", tokenvalue)
== 0 ) {
if (in_close) old_state = TEXT;
else old_state = PRE;
}
strcpy(val, tokenvalue);
return(tokentype);
} else {
if ((i = bsearch(tokenvalue, attr_table,
ATSZ)) >= 0) {
tokentype = attr_table[i].kw_token;
state = AVALUE;
strcpy(val, tokenvalue); return(tokentype);
} else { /* Unknown attribute. Actually,
it's much more easier */
/* just ignoring it in YACC then trying to skip it here*/
tokentype = _IDENTIFIER;
state = AVALUE;
strcpy(val, tokenvalue); return(tokentype);
}
}
}
if (state == IN_QUOTE) {
if ( c == '\"' ) {
c = nextchar(infp, listfp); charno++;
state = ATTR;
tokenvalue[0] = '\"'; tokenvalue[1] = '\0';
tokentype = '\"';
strcpy(val, tokenvalue);
return(tokentype);
}
tokentype = _QUOTED_ATTR; /* maybe URL, maybe rain, maybe snow... */
/* state = IN_QUOTE; */
while ( c != '\"' ) {
tokenvalue[i++] = c;
c = nextchar(infp, listfp); charno++;
}
- 4 -
tokenvalue[i++] = '\0';
/* c = nextchar(infp, listfp); Skip the
closing quotation mark */
strcpy(val, tokenvalue);
return(tokentype);
} /* end if for (state == IN_QUOTE) */
return 0; /* Òàêîãî íå ìîæåò áûòü... */
}
int
yylex()
{
int
tktyp;
char tkval[NMSZ];
if (!USE_BUFFER) {
tktyp = nexttok(tkval);
switch (tktyp) {
case _OpenTag: {
tktyp = nexttok(tkval);
if (opened_par) {
if (tktyp == _C_KEYWORD || tktyp == _S_KEYWORD) {
if (!keyword_table[bsearch(tkval, keyword_table, KW...
lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
lex_buff[1].tktyp = _OpenTag ;
strcpy(lex_buff[...
lex_buff[2].tktyp = _EndTag ;
strcpy(lex_buff[...
lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...
lex_buff[4].tktyp = _CloseTag ; strcpy(lex_buff[...
lex_buff_size = 5; USE_BUFFER = TRUE;
opened_par = (strcmp(tkval, "P")==0);
} else {
lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
lex_buff[1].tktyp = _OpenTag ;
strcpy(lex_buff[...
lex_buff_size = 2; USE_BUFFER = TRUE;
}
}
} else { // i.e. opened_par == FALSE
opened_par = (strcmp(tkval, "P")==0);
lex_buff[0].tktyp = tktyp ;
strcpy(lex_buff[0].tkv...
lex_buff[1].tktyp = _OpenTag ;
strcpy(lex_buff[1].tkv...
lex_buff_size = 2; USE_BUFFER = TRUE;
}
break;
}
case _CloseTag: {
tktyp = nexttok(tkval);
if (opened_par) {
if (keyword_table[bsearch(tkval, keyword_table, KWSZ)]...
lex_buff[0].tktyp = tktyp
; strcpy(lex_buff[0]....
lex_buff[1].tktyp = _CloseTag ; strcpy(lex_buff[1]....
lex_buff_size = 2; USE_BUFFER = TRUE;
} else {
if (strcmp(tkval, "P")==0) {
lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
lex_buff[1].tktyp = _CloseTag ; strcpy(lex_buff[...
lex_buff_size = 2; USE_BUFFER = TRUE;
opened_par = FALSE;
} else {
lex_buff[0].tktyp = tktyp ; strcpy(lex_buff[...
lex_buff[1].tktyp = _CloseTag ; strcpy(lex_buff[...
lex_buff[2].tktyp = _EndTag ;
strcpy(lex_buff[...
lex_buff[3].tktyp = _C_KEYWORD; strcpy(lex_buff[...
lex_buff[4].tktyp = _CloseTag ; strcpy(lex_buff[...
lex_buff_size = 5; USE_BUFFER =
TRUE;
opened_par = FALSE;
}
}
} else {
lex_buff[0].tktyp = tktyp ;
strcpy(lex_buff[0].tkv...
lex_buff[1].tktyp = _CloseTag ; strcpy(lex_buff[1].tkv...
- 5 -
lex_buff_size = 2; USE_BUFFER = TRUE;
}
break;
}
case _IDENTIFIER: {
if ( !(in_open || in_close) && (!opened_par)) {
lex_buff[0].tktyp = _IDENTIFIER; strcpy(lex_buff[0].tkv...
lex_buff[1].tktyp = _EndTag ;
strcpy(lex_buff[1].tkv...
lex_buff[2].tktyp = _C_KEYWORD ; strcpy(lex_buff[2].tkv...
lex_buff[3].tktyp = _OpenTag ;
strcpy(lex_buff[3].tkv...
lex_buff_size = 4; USE_BUFFER = TRUE;
opened_par = TRUE;
}
break;
}
case 0: { // EOF
if (opened_par) {
lex_buff[0].tktyp = tktyp ;
strcpy(lex_buff[0].tkv...
lex_buff[1].tktyp = _EndTag ;
strcpy(lex_buff[1].tkv...
lex_buff[2].tktyp = _C_KEYWORD ; strcpy(lex_buff[2].tkv...
lex_buff[3].tktyp = _CloseTag ;
strcpy(lex_buff[3].tkv...
lex_buff_size = 4; USE_BUFFER = TRUE;
opened_par = TRUE;
}
}
}
}
if (USE_BUFFER) {
tktyp = lex_buff[--lex_buff_size].tktyp;
strcpy(tkval, lex_buff[
lex_buff_size].tkval);
if (lex_buff_size == 0) USE_BUFFER =
FALSE;
}
yylval.pchar = (char *) malloc(1 +
strlen(tkval));
strcpy(yylval.pchar, tkval);
return(tktyp);
}
Ïðèìå÷àíèå:
ðàñïå÷àòêè ôàéëîâ htm_cnst.h, htm_glob.h, htm_tokn.h è
htm_err.h ñì. â ïðèëîæåíèè À apendix'à 4.4.
- 6 -
Ëàáîðàòîðíàÿ ðàáîòà 2
Çàäàíèå:
Ïîñòðîèòü ôîðìàòèçàòîð Ñ-ôàéëîâ. Íåîáõîäèìî ðåàëèçîâàòü
ñëåäóþùèå
ôóíêöèè:
-
`{` - âñåãäà c íîâîé ñòðîêè áåç îòñòóïà
-
`{` - íèêîãäà íå ïåðåíîñèòñÿ
-
`{` - âñåãäà c íîâîé ñòðîêè ñ îòñòóïîì
- 0
- âñòàâëÿòü ñèìâîë TAB ïðè îòñòóïå
-
1..8 âñòàâëÿòü x ïðîáåëîâ
- ôîðìàòèðîâàòü
êîììåíòàðèè c xx ïî yy ïîçèöèè
-
íåñêîëüêî êîìàíä íà îäíîé ñòðîêå
-
`=` âûäåëÿòü ïðîáåëàìè
Òåêñò
ïðîãðàììû:
#include
<stdio.h>
#include
<dos.h>
#include
<ctype.h>
#include
<string.h>
#define
ERROR 0
#define
IDENT 1
#define
KEYWORD 2
#define
BRACKETS 3
#define
OTHER 4
#define
BEGIN '{'
#define
END
'}'
#define
COMMA ','
#define
SEMI ';'
#define
LB
'\n'
char
val[100];
char
comment[200];
int pos=0;
int undo;
int backspace;
#define
N_KW 8
char
keywords[N_KW][20]={
"for",
"while",
"do",
"if",
"switch",
"else",
"case",
"default"};
//
-----------------------------------------------------------------
void
blockQuote (char *(&s),FILE *f)
{
char c=fgetc(f);
*(s++)=c, c=0;
while (c!='\'' && c!='\"') {
c=*(s++)=fgetc(f);
if (c=='\\')
c=*(s++)=fgetc(f);
}
}
//
-----------------------------------------------------------------
int
getNext (FILE *f)
{
char *s=val,c;
int buf=undo;
static int symbol=0;
static int startPos=1;
c=fgetc(f);
- 7 -
startPos=0;
if (isalnum(c) || c=='_') if (i!=N_KW) *(s++)=' ';
if (c=='\'' || c=='\"') {
symbol=0;
ungetc(c,f);
blockQuote (s,f);
*s=0;
return IDENT;
}
if (c=='=' && E && !symbol)
{
*(s++)=' ';
*(s++)=c;
*(s++)=' ';
*s=0;
return OTHER;
}
*s=c, *(s+1)=0;
symbol=1;
return OTHER;
}
void
outVal (FILE *f,int back=0)
{
char *s=val;
if (backspace && !back)
if (!T) {
fputc (9,f);
pos+=F3;
}
else {
for (int j=0;j<T;j++)
{
fputc (' ',f);
pos++;
}
}
backspace=0;
while (*s) {
fputc (*(s++),f);
pos++;
}
}
void
outCR (FILE *f,int tab,int newLine=0)
{
int limit=tab-1+newLine;
// Out Comments
if (*comment)
outComment (f);
if (!newLine) {
fputc ('\n',f);
pos=0;
- 8 -
}
for (int i=0;i<limit;i++)
{
if (!T) {
fputc (9,f);
pos+=F3;
}
else {
for (int j=0;j<T;j++) {
fputc (' ',f);
pos++;
}
}
}
if (tab && !newLine)
backspace=1;
}
//
-----------------------------------------------------------------
int
format (FILE *f_in,FILE *f_out)
{
int tab=0,tab1=0,tab2=0,lb=0;
int lex;
while (!feof(f_in))
{
lex=getNext(f_in);
switch (lex) {
case KEYWORD: {
lb=0;
outVal (f_out);
lex=getNext(f_in);
break;
}
case BEGIN: {
tab1=0;
if (!lb && N!=2) outCR (f_out,tab);
if (N==3) outCR (f_out,1,1);
outVal(f_out);
outCR (f_out,++tab);
lb=1;
break;
}
case END: {
if (!lb) outCR (f_out,tab);
lb=1;
tab1=0;
lex=getNext (f_in);
if (lex==LB) lex=getNext(f_in);
undo=lex;
outCR (f_out,tab);
lb=1;
break;
}
case SEMI: {
lb=0;
tab1=0;
outVal (f_out);
lex=getNext(f_in);
undo=lex;
break;
}
case IDENT: {
lb=0;
outVal (f_out);
lex=getNext (f_in);
undo=lex;
break;
}
case LB: {
- 9 -
int used;
tab1=0;
if (*comment) {
outCR (f_out,tab);
used=1;
}
lex=getNext (f_in);
if (N!=2 || lex!=BEGIN) {
if (!used) outCR (f_out,tab);
lb=1;
}
undo=lex;
break;
}
case EOF:
return 1;
default: {
lb=0;
outVal(f_out);
}
}
}
return 1;
}
Ïðèìå÷àíèå:
Íåîáõîäèìûå ôóíêöèè áûëè ðåàëèçîâàíû â ïîëíîì îáúåìå
è ïðè ñäà÷å íàðåêàíèé íå âûçâàëè. (Òåñòîâûé ïðèìåð
ïðèâåäåí â ïðèëîæåíèè Á apendix'à 4.5)
- 10 -
Ëàáîðàòîðíàÿ ðàáîòà 3
Çàäàíèå:
Ïðîàíàëèçèîâàòü
õô è âûáàòü ëó÷øóþ äëÿ ñëó÷àéíîãî ðàñïåäåëåíèÿ èä-îâ
Îáîáùåííàÿ
ôîìóëà âû÷èñëåíèÿ õô:
h0 = 0;
h(i) =
Alf* h(i-1) [+] C(i), i=1..k
k -
\äëèíà ñòðîêè. [+] - íåêîòîàÿ ïðîèçâîëüíàÿ îïåðàöèÿ
(+, -, <<, _rotl, ^ |, &)
Ïðîàíàëèçèîâàòü
ýòè è ëþáûå äðóãèå õô íà êîëè÷åñòâî êîëëèçèé (êîíôëèêòîâ)
äëÿ
íåêîòîðûõ ñëó÷àéíûõ ïîñëåäîâàòåëüíîñòü. Íàïðèìåð:
1) id'û
ÿçûêà C (äî 50).
2) ----
"" ---- (äî 100).
3) ----
"" ---- (äî 1000).
4)
Âíåøíèå èìåíà ñòàíäàòíîé áèáëîèîòòåêè BC++.
5)
Âíåøíèå èìåíà ãàôè÷åñêîé áèáëèîòåêè BC++.
6)
Ñëó÷àéíî ãåíåèóåìûå èìåíà (~600)
7)
Àíãëèéñêèå ññëîâà ñ ïåôèêñàìè è/èëè ñóôôèêñàìè (xxx) - îêîëî 200
8) 300
èìåí âèäà: w000, w001, w002, etc
Àíàëèç
ñòàòèñòèêè ñâåñòè â òàáëèöó/ãðàôèê
Òåêñ
ïðîãðàììû àíàëèçàòîðà:
#include
<stdio.h>
#include
<stdlib.h>
unsigned
hash_shift(char *s)
{
unsigned hash = 0;
while (*s)
hash = (hash << 1) + *s++;
return hash;
}
unsigned
hash_rotl(char *s)
{
unsigned hash = 0;
while (*s)
hash = _rotl(hash,1) ^ *s++;
return hash;
}
long
hash_pgw(char *s)
{
char *p;
unsigned long h = 0, g;
for(p=s;*p;p++)
{
h = (h << 4) + *p;
if (g = h & 0xF0000000)
{
h
= h^(g >>24);
h
= h^g;
}
}
return h;
}
unsigned
hash_4 (char *s)
{
unsigned h = 0;
const D=5;
- 11 -
while (*s)
h = D*h + *s++;
return h;
}
main
(int argc,char **argv)
{
int n=0,total=0;
int
placed1=0,placed2=0,placed3=0,placed4=0;
int max1=0,max2=0,max3=0,max4=0;
int *table1,*table2,*table3,*table4;
FILE *f;
char buf[100];
puts ("Ëàáîðàòîðíàÿ ðàáîòà 3.
Èññëåäîâàíèå õýø-ôóíêöèè.");
puts ("Ëÿïóíîâ È.Â. ÀÏ-61");
if (argc<3)
{
puts ("\n HASH.COM <n> <file_name>");
puts (" n - ÷èñëî ýëåìåíòîâ â
òàáëèöå");
puts (" file_name - èìÿ ôàéëà
ñ èäåíòèôèêàòîðàìè \n");
return 0;
}
n=atoi(argv[1]);
if (n<10)
{
puts ("\n Ñëèøêîì ìàëåíüêàÿ òàáëèöà
\n");
return 0;
}
table1=(int*)calloc(n,sizeof(int));
table2=(int*)calloc(n,sizeof(int));
table3=(int*)calloc(n,sizeof(int));
table4=(int*)calloc(n,sizeof(int));
if (!table1 || !table2 || !table3 ||
!table4)
{
puts ("\nÍå õâàòàåò ïàìÿòè äëÿ
òàáëèö\n");
return 0;
}
if ((f=fopen(argv[2],"r"))==NULL)
{
puts ("\nÍå ìîãó îòêðûòü óêàçàííûé
ôàéë\n");
return 0;
}
while (!feof(f))
if (fscanf (f,"%s",buf)==1)
{
table1[hash_shift(buf)%n]++;
table2[hash_rotl(buf)%n]++;
table3[hash_pgw(buf)%n]++;
table4[hash_4(buf)%n]++;
puts (buf);
total++;
}
puts ("Ñòàòèñòèêà :");
for (int i=0;i<n;i++)
{
if (table1[i]) {
if
(max1<table1[i]) max1=table1[i];
placed1++;
}
if (table2[i]) {
if
(max2<table2[i]) max2=table2[i];
placed2++;
}
if (table3[i]) {
if
(max3<table3[i]) max3=table3[i];
placed3++;
}
- 12 -
if (table4[i]) {
if
(max4<table4[i]) max4=table4[i];
placed4++;
}
}
printf (" HASH_SHIFT : %f max=%d\n",(float)total/placed1,max1);
printf (" HASH_ROTL : %f
max=%d\n",(float)total/placed2,max2);
printf (" HASH_PGW : %f
max=%d\n",(float)total/placed3,max3);
printf (" HASH_4 : %f
max=%d\n",(float)total/placed4,max4);
fclose (f);
return 0;
}
#include
<stdio.h>
#include
<dos.h>
#include
<ctype.h>
#include
<string.h>
#define
ERROR 0
#define
IDENT 1
#define
KEYWORD 2
#define
BRACKETS 3
#define
OTHER 4
#define
BEGIN '{'
#define
END
'}'
#define
COMMA ','
#define
SEMI ';'
#define
LB
'\n'
//
Options
int
T=0,N=1,F1=45,F2=80,F3=8,S=0,E=0;
char
val[100];
char
comment[200];
int pos=0;
int undo;
int backspace;
#define
N_KW 8
char
keywords[N_KW][20]={
"for",
"while",
"do",
"if",
switch",
"else",
"case",
"default"};
//
--------------------------------------------------------------------
int
format (FILE *f_in,FILE *f_out);
//
--------------------------------------------------------------------
main
(int argc,char *argv[]) {FILE *f_in,*f_out;char *s;puts ("Ôîðìàòèçàòîð
CPP-ôàéëîâ. Ëàáîðàòîðíàÿ ðàáîòà 2.");puts ("Ëÿïóíîâ È.Â. ÀÏ-61 04.04.1996\n");
if (argc<2){puts ("Êàê ìåíÿ
çàïóñòèòü :");puts ("FCPP.COM
<êëþ÷è> <CPP-ôàéë>");
puts ("<êëþ÷è> :"); puts
(" -n1 `{` - âñåãäà c íîâîé
ñòðîêè áåç îòñòóïà"); puts
(" -n2 `{` - íèêîãäà íå
ïåðåíîñèòñÿ");
puts (" -n3
`{` - âñåãäà c íîâîé ñòðîêè ñ îòñòóïîì"); puts (" -tx 0 -
âñòàâëÿòü ñèìâîë TAB ïðè îòñòóïå");
puts (" 1..8
âñòàâëÿòü x ïðîáåëîâ"); puts (" -fxx:yy[:z]
ôîðìàòèðîâàòü êîììåíòàðèè c xx ïî yy ïîçèöèè");
puts
(" -s íåñêîëüêî êîìàíä íà
îäíîé ñòðîêå"); puts (" -e
`=` âûäåëÿòü ïðîáåëàìè");
return 0;}
// scan the keys
for
(int i=1;i<argc && *argv[i]=='-';i++){ switch (*(argv[i]+1)) {case
'n': N<0) N=1;
case 't': case 'e': {
E=1; break;
} case
'f': { char *s=argv[i]+2; int
buf; F1=0; while (*s!=':' && *s) {
F1*=10;
F1+=(*(s++)-'0'); } if (F1<0 || F1>160) F1=45;
if (!*s) break; s++; F2=0; while (*s && *s!=':') { F2*=10;
F2+=(*(s++)-'0'); } if (F1>=F2 || F2>160) F2=80; if (!*s) break;
while (*s)
F3=(*(s++)-'0');
if (F3<1 || F3>8) F3=8;
break;
}
case 's': {
S=1;
break;
}
}
}
if (!(f_in=fopen(argv[i],"r")))
{
printf ("Ôàéë %s íå îòêðûâàåòñÿ
...",argv[1]);
return 0;
}
s=argv[i];while (*(++s)!='.' &&
*s); *(s-1)='~'; if
(!(f_out=fopen(argv[i],"w")))
{ printf ("Ôàéë %s íå îòêðûâàåòñÿ
...",argv[1]); return 0; }
if (format(f_in,f_out)) puts ("Ôàéë îòôîðìàòèðîâàí!\n");
else puts ("Îøèáêà!\n");
fclose (f_in); fclose (f_out);
return 0;}
// -----------------------------------------------------------------
void
blockQuote (char *(&s),FILE *f){ char c=fgetc(f); *(s++)=c, c=0; while
(c!='\'' && c!='\"') { c=*(s++)=fgetc(f);
if (c=='\\') c=*(s++)=fgetc(f); }}
#include #include unsigned
hash_shift(char *s) { unsigned hash = 0; while (*s) hash = (hash << 1) +
*s++; return hash; } unsigned hash_rotl(char *s) { unsigned hash = 0; while
(*s) hash = _rotl(hash,1) ^ *s++; return hash; } long hash_pgw(char *s) { char
*p; unsigned long h = 0, g; for(p=s;*p;p++) { h = (h << 4) + *p; if (g =
h & 0xF0000000) { h = h^(g >>24); h = h^g; } } return h; } unsigned
hash_4 (char *s) { unsigned h = 0; const D=5; while (*s) h = D*h + *s++; return
h; } main (int argc,char **argv) { int n=0,total=0; int
placed1=0,placed2=0,placed3=0,placed4=0; int max1=0,max2=0,max3=0,max4=0; int
*table1,*table2,*table3,*table4; FILE *f; char buf[100]; puts
("Ëàáîðàòîðíàÿ ðàáîòà 3. Èññëåäîâàíèå õýø-ôóíêöèè."); puts
("Ëÿïóíîâ È.Â. ÀÏ-61"); if (argc
|  | |
|