Merge pull request #79 from DaveMcEwan/improvement78

Improvement: Handle non-UTF8 files
This commit is contained in:
dalance 2023-02-08 09:13:31 +09:00 committed by GitHub
commit 83f850f79e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 102 additions and 13 deletions

View File

@ -15,6 +15,9 @@ pub enum Error {
path: PathBuf, path: PathBuf,
}, },
#[error("File could not be read as UTF8: {0:?}")]
ReadUtf8(PathBuf),
#[error("Include error")] #[error("Include error")]
Include { Include {
#[from] #[from]
@ -34,7 +37,7 @@ pub enum Error {
DefineNotFound(String), DefineNotFound(String),
#[error("Define must have argument")] #[error("Define must have argument")]
DefineNoArgs, DefineNoArgs(String), // String is the macro identifier.
#[error("Exceed recursive limit")] #[error("Exceed recursive limit")]
ExceedRecursiveLimit, ExceedRecursiveLimit,

View File

@ -149,18 +149,21 @@ fn preprocess_inner<T: AsRef<Path>, U: AsRef<Path>, V: BuildHasher>(
})?; })?;
let mut reader = BufReader::new(f); let mut reader = BufReader::new(f);
let mut s = String::new(); let mut s = String::new();
reader.read_to_string(&mut s)?;
preprocess_str( if let Err(_) = reader.read_to_string(&mut s) {
&s, Err(Error::ReadUtf8(PathBuf::from(path.as_ref())))
path, } else {
pre_defines, preprocess_str(
include_paths, &s,
ignore_include, path,
strip_comments, pre_defines,
0, // resolve_depth include_paths,
include_depth, ignore_include,
) strip_comments,
0, // resolve_depth
include_depth,
)
}
} }
struct SkipNodes<'a> { struct SkipNodes<'a> {
@ -942,7 +945,7 @@ fn resolve_text_macro_usage<T: AsRef<Path>, U: AsRef<Path>>(
let mut arg_map = HashMap::new(); let mut arg_map = HashMap::new();
if !define.arguments.is_empty() && no_args { if !define.arguments.is_empty() && no_args {
return Err(Error::DefineNoArgs); return Err(Error::DefineNoArgs(define.identifier.clone()));
} }
for (i, (arg, default)) in define.arguments.iter().enumerate() { for (i, (arg, default)) in define.arguments.iter().enumerate() {
@ -1065,6 +1068,73 @@ mod tests {
); );
} // }}} } // }}}
#[test]
#[allow(non_snake_case)]
fn err_DefineNoArgs() { // {{{
match preprocess_usualargs("err_DefineNoArgs.sv").unwrap_err() {
Error::DefineNoArgs(identifier) => {
assert_eq!(
identifier,
String::from("A")
);
}
_ => {
panic!("Error::DefineNoArgs not raised.");
}
};
} // }}}
#[test]
#[allow(non_snake_case)]
fn err_DefineNotFound() { // {{{
match preprocess_usualargs("err_DefineNotFound.sv").unwrap_err() {
Error::DefineNotFound(identifier) => {
assert_eq!(
identifier,
String::from("A")
);
}
_ => {
panic!("Error::DefineNotFound not raised.");
}
};
} // }}}
#[test]
#[allow(non_snake_case)]
fn err_DefineArgNotFound() { // {{{
match preprocess_usualargs("err_DefineArgNotFound.sv").unwrap_err() {
Error::DefineArgNotFound(identifier) => {
assert_eq!(
identifier,
String::from("c")
);
}
_ => {
panic!("Error::DefineArgNotFound not raised.");
}
};
} // }}}
#[test]
#[allow(non_snake_case)]
fn err_ReadUtf8() { // {{{
match preprocess_usualargs("err_ReadUtf8.sv").unwrap_err() {
Error::ReadUtf8(path) => {
assert_eq!(
path,
PathBuf::from(format!(
"{}/testcases/err_ReadUtf8.sv",
env::var("CARGO_MANIFEST_DIR").unwrap(),
))
);
}
_ => {
panic!("Error::ReadUtf8 not raised.");
}
};
} // }}}
#[test] #[test]
#[allow(non_snake_case)] #[allow(non_snake_case)]
fn IEEE18002017_keywords_if2_13642005() { // {{{ fn IEEE18002017_keywords_if2_13642005() { // {{{

View File

@ -0,0 +1,5 @@
/* IEEE1800-2017 Clause 22.5.1 top of page 678
*/
`define MACRO1(a=5,b="B",c) $display(a,,b,,c);
`MACRO1(1) // Macro called without required argument `c`.

View File

@ -0,0 +1,4 @@
`define A(a)
`A // Macro called without required argument.

View File

@ -0,0 +1,3 @@
`A // Macro called without definition.

View File

@ -0,0 +1,4 @@
// In the next comment, there are non-UTF8 bytes.
module M;
// Non-UTF8:XñòóôõöX
endmodule