Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
node-sass
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
楚学文
node-sass
Commits
d5abc011
Commit
d5abc011
authored
Feb 13, 2012
by
Aaron Leung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixing some tiny but breaking bugs.
parent
2053f9c2
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
100 additions
and
27 deletions
+100
-27
prefix_primitives.c
src/parser/prefix_primitives.c
+60
-6
prefix_primitives.h
src/parser/prefix_primitives.h
+19
-5
test.c
src/parser/test.c
+21
-16
No files found.
src/parser/prefix_primitives.c
View file @
d5abc011
#include <ctype.h>
#include <ctype.h>
#include <string.h>
#include <string.h>
#include <stdio.h>
#include "prefix_primitives.h"
#include "prefix_primitives.h"
int
prefix_is_exactly
(
char
*
src
,
char
*
pre
)
{
int
prefix_is_exactly
(
char
*
src
,
char
*
pre
)
{
...
@@ -11,6 +12,18 @@ int prefix_is_exactly(char *src, char* pre) {
...
@@ -11,6 +12,18 @@ int prefix_is_exactly(char *src, char* pre) {
}
}
}
}
int
prefix_is_one_of
(
char
*
src
,
char
*
class
)
{
int
i
;
for
(
i
=
0
;
class
[
i
];
i
++
)
if
(
class
[
i
]
==
src
[
0
])
return
1
;
return
0
;
}
int
prefix_is_some_of
(
char
*
src
,
char
*
class
)
{
int
p
;
for
(
p
=
0
;
prefix_is_one_of
(
src
+
p
,
class
);
p
++
)
;
return
p
;
}
int
prefix_is_delimited_by
(
char
*
src
,
char
*
beg
,
char
*
end
,
int
esc
)
{
int
prefix_is_delimited_by
(
char
*
src
,
char
*
beg
,
char
*
end
,
int
esc
)
{
int
p
=
0
;
int
p
=
0
;
int
len
=
prefix_is_exactly
(
src
,
beg
);
int
len
=
prefix_is_exactly
(
src
,
beg
);
...
@@ -19,23 +32,63 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
...
@@ -19,23 +32,63 @@ int prefix_is_delimited_by(char *src, char *beg, char *end, int esc) {
while
(
1
)
{
while
(
1
)
{
if
(
src
[
p
]
==
'\0'
)
return
0
;
if
(
src
[
p
]
==
'\0'
)
return
0
;
len
=
prefix_is_exactly
(
src
+
p
,
end
);
len
=
prefix_is_exactly
(
src
+
p
,
end
);
if
(
len
&&
esc
&&
src
[
p
-
1
]
!=
'\\'
)
return
p
+
len
;
if
(
len
&&
(
!
esc
||
src
[
p
-
1
]
!=
'\\'
)
)
return
p
+
len
;
p
+=
len
?
len
:
1
;
p
+=
len
?
len
:
1
;
}
}
}
}
DEFINE_SINGLE_CTYPE_MATCHER
(
space
);
DEFINE_SINGLE_CTYPE_MATCHER
(
alpha
);
DEFINE_SINGLE_CTYPE_MATCHER
(
digit
);
DEFINE_SINGLE_CTYPE_MATCHER
(
xdigit
);
DEFINE_SINGLE_CTYPE_MATCHER
(
alnum
);
DEFINE_SINGLE_CTYPE_MATCHER
(
punct
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
space
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
space
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
alpha
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
alpha
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
digit
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
digit
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
xdigit
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
xdigit
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
alnum
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
alnum
);
DEFINE_CTYPE_SEQUENCE_MATCHER
(
punct
);
DEFINE_TO_EOL_MATCHER
(
line_comment
,
"//"
);
DEFINE_TO_EOL_MATCHER
(
line_comment
,
"//"
);
DEFINE_DELIMITED_MATCHER
(
block_comment
,
"/*"
,
"*/"
,
0
);
DEFINE_DELIMITED_MATCHER
(
block_comment
,
"/*"
,
"*/"
,
0
);
DEFINE_DELIMITED_MATCHER
(
d
q
string
,
"
\"
"
,
"
\"
"
,
1
);
DEFINE_DELIMITED_MATCHER
(
d
ouble_quoted_
string
,
"
\"
"
,
"
\"
"
,
1
);
DEFINE_DELIMITED_MATCHER
(
s
q
string
,
"'"
,
"'"
,
1
);
DEFINE_DELIMITED_MATCHER
(
s
ingle_quoted_
string
,
"'"
,
"'"
,
1
);
DEFINE_DELIMITED_MATCHER
(
interpolant
,
"#{"
,
"}"
,
0
);
DEFINE_DELIMITED_MATCHER
(
interpolant
,
"#{"
,
"}"
,
0
);
int
prefix_is_string
_constant
(
char
*
src
)
{
int
prefix_is_string
(
char
*
src
)
{
int
len
=
prefix_is_d
q
string
(
src
);
int
len
=
prefix_is_d
ouble_quoted_
string
(
src
);
return
len
?
len
:
prefix_is_s
q
string
(
src
);
return
len
?
len
:
prefix_is_s
ingle_quoted_
string
(
src
);
}
}
DEFINE_EXACT_MATCHER
(
lparen
,
"("
);
DEFINE_EXACT_MATCHER
(
rparen
,
")"
);
DEFINE_EXACT_MATCHER
(
lbrack
,
"["
);
DEFINE_EXACT_MATCHER
(
rbrack
,
"]"
);
DEFINE_EXACT_MATCHER
(
lbrace
,
"{"
);
DEFINE_EXACT_MATCHER
(
rbrace
,
"}"
);
DEFINE_EXACT_MATCHER
(
asterisk
,
"*"
);
/* not sure I'm gonna' need these
DEFINE_EXACT_MATCHER(exclamation, "!");
DEFINE_EXACT_MATCHER(pound, "#");
DEFINE_EXACT_MATCHER(hash, "#");
DEFINE_EXACT_MATCHER(dollar, "$");
DEFINE_EXACT_MATCHER(percent, "%");
DEFINE_EXACT_MATCHER(ampersand, "&");
DEFINE_EXACT_MATCHER(lparen, "(");
DEFINE_EXACT_MATCHER(rparen, ")");
DEFINE_EXACT_MATCHER(times, "*");
DEFINE_EXACT_MATCHER(comma, ",");
DEFINE_EXACT_MATCHER(hyphen, "-");
DEFINE_EXACT_MATCHER(minus, "-");
DEFINE_EXACT_MATCHER(period, ".");
DEFINE_EXACT_MATCHER(dot, ".");
DEFINE_EXACT_MATCHER(slash, "/");
DEFINE_EXACT_MATCHER(divide, "/");
DEFINE_EXACT_MATCHER(colon, ":");
DEFINE_EXACT_MATCHER(semicolon, ";");
DEFINE_EXACT_MATCHER(lt, "<");
DEFINE_EXACT_MATCHER(lte, "<=");
DEFINE_EXACT_MATCHER(gt, ">");
DEFINE_EXACT_MATCHER(gte, ">=");
*/
\ No newline at end of file
src/parser/prefix_primitives.h
View file @
d5abc011
int
prefix_is_exactly
(
char
*
,
char
*
);
int
prefix_is_exactly
(
char
*
,
char
*
);
int
prefix_is_one_of
(
char
*
,
char
*
);
int
prefix_is_some_of
(
char
*
,
char
*
);
int
prefix_is_delimited_by
(
char
*
,
char
*
,
char
*
,
int
);
int
prefix_is_delimited_by
(
char
*
,
char
*
,
char
*
,
int
);
#define DECLARE_MATCHER(name) \
#define DECLARE_MATCHER(name) \
int prefix_is_ ## name(char *)
int prefix_is_ ## name(char *)
#define DEFINE_EXACT_MATCHER(name, prefix) \
int prefix_is_ ## name(char *src) { \
return prefix_is_exactly(src, prefix); \
}
#define DEFINE_SINGLE_CTYPE_MATCHER(type) \
#define DEFINE_SINGLE_CTYPE_MATCHER(type) \
int prefix_is_one_ ## type(char *src) \
int prefix_is_one_ ## type(char *src)
{
\
return is ## type(src[0]) ? 1 : 0; \
return is ## type(src[0]) ? 1 : 0; \
}
}
#define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \
#define DEFINE_CTYPE_SEQUENCE_MATCHER(type) \
int prefix_is_ ## type ## s(char *src) { \
int prefix_is_ ## type ## s(char *src) { \
int p = 0; \
int p = 0; \
while (is ## type(src[p
++]))
; \
while (is ## type(src[p
])) p++
; \
return p; \
return p; \
}
}
...
@@ -28,14 +35,21 @@ int prefix_is_ ## name(char *src) { \
...
@@ -28,14 +35,21 @@ int prefix_is_ ## name(char *src) { \
return p; \
return p; \
}
}
DECLARE_MATCHER
(
one_space
);
DECLARE_MATCHER
(
one_alpha
);
DECLARE_MATCHER
(
one_digit
);
DECLARE_MATCHER
(
one_xdigit
);
DECLARE_MATCHER
(
one_alnum
);
DECLARE_MATCHER
(
one_punct
);
DECLARE_MATCHER
(
spaces
);
DECLARE_MATCHER
(
spaces
);
DECLARE_MATCHER
(
alphas
);
DECLARE_MATCHER
(
alphas
);
DECLARE_MATCHER
(
digits
);
DECLARE_MATCHER
(
digits
);
DECLARE_MATCHER
(
xdigits
);
DECLARE_MATCHER
(
xdigits
);
DECLARE_MATCHER
(
alnums
);
DECLARE_MATCHER
(
alnums
);
DECLARE_MATCHER
(
puncts
);
DECLARE_MATCHER
(
line_comment
);
DECLARE_MATCHER
(
line_comment
);
DECLARE_MATCHER
(
block_comment
);
DECLARE_MATCHER
(
block_comment
);
DECLARE_MATCHER
(
d
q
string
);
DECLARE_MATCHER
(
d
ouble_quoted_
string
);
DECLARE_MATCHER
(
s
q
string
);
DECLARE_MATCHER
(
s
ingle_quoted_
string
);
DECLARE_MATCHER
(
interpolant
);
DECLARE_MATCHER
(
interpolant
);
DECLARE_MATCHER
(
string
_constant
);
DECLARE_MATCHER
(
string
);
src/parser/test.c
View file @
d5abc011
...
@@ -4,26 +4,31 @@
...
@@ -4,26 +4,31 @@
#include <stdlib.h>
#include <stdlib.h>
#include "prefix_primitives.h"
#include "prefix_primitives.h"
int
main
()
{
char
*
s
=
"'this is a
\"
string
\"
now' blah blah blah"
;
void
printn
(
char
*
s
,
int
n
)
{
int
l
=
prefix_is_string_constant
(
s
);
if
(
l
)
{
printf
(
"matched a string literal of length %d:
\n
"
,
l
);
int
i
;
int
i
;
for
(
i
=
0
;
i
<
l
;
i
++
)
{
printf
(
"matched %d characters:
\t
"
,
n
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
putchar
(
s
[
i
]);
putchar
(
s
[
i
]);
}
}
putchar
(
'\n'
);
putchar
(
'\n'
);
}
}
else
{
printf
(
"matched %d characters
\n
"
,
l
);
int
main
()
{
}
char
*
s
=
"'this
\\
'is
\\
' a
\"
string
\"
now' blah blah blah"
;
char
*
t
=
"/* this is a c comment
\\
x */ blah blah"
;
char
*
u
=
"#{ this is an interpolant
\\
x } blah blah"
;
char
*
v
=
"hello my name is aaron"
;
printn
(
s
,
prefix_is_string
(
s
));
printn
(
s
,
prefix_is_one_of
(
s
,
"abcde+'"
));
printn
(
s
,
prefix_is_some_of
(
s
,
"'abcdefghijklmnopqrstuvwxyz "
));
printn
(
t
,
prefix_is_block_comment
(
t
));
printn
(
u
,
prefix_is_interpolant
(
u
));
printn
(
v
,
prefix_is_alphas
(
v
));
printn
(
v
,
prefix_is_one_alpha
(
v
));
printn
(
v
,
prefix_is_exactly
(
v
,
"hello"
));
unsigned
char
x
;
printf
(
"By the way, punctuation symbols are:
\n
"
);
for
(
x
=
'\0'
;
x
<
128
;
x
++
)
if
(
ispunct
(
x
))
printf
(
"%c"
,
x
);
putchar
(
'\n'
);
printf
(
"By the way, 0 || 24 is: %d
\n
"
,
0
||
24
);
printf
(
"And 24 || 0 is: %d
\n
"
,
24
||
0
);
return
0
;
return
0
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment