JSON-for-VHDL icon indicating copy to clipboard operation
JSON-for-VHDL copied to clipboard

Loading from file in current (sim) directory fails

Open rhinton opened this issue 3 years ago • 2 comments

My build system is setup to copy files to the simulation directory, so I can load them without any relative or absolute path specification. Doing so causes problems with the jsonLoad function.

  1. jsonLoad calls decode on the input string, which causes a bunch of errors. The decode function looks for specific non-alphanumeric characters in the first or second position of the string in order to detect a file path vs. encoded string.
  2. jsonLoad checks for ".json" in the decoded string (raw) instead of the input string. Because all of the hex decode calls failed on my path, there isn't anything interesting in the decoded string. So jsonLoad tries to parse my file name as a JSON string.

One workaround in my code would be to specify a path ./my_file_name.json instead of just my_file_name.json. Another is to call jsonReadFile directly. I picked the latter.

Long-term, I suggest either splitting jsonLoad to be less of a "do what I mean" function, or making it smarter so it does what I mean in this case.

rhinton avatar Nov 27 '21 03:11 rhinton

@umarcor can you help here? I think you contributed this addition to the code, right?

Paebbels avatar Nov 29 '21 19:11 Paebbels

@rhinton's explanation is correct.

  • We require users to use ./ or / if they are providing a file.
  • Users can work around it by removing ./ and calling jsonParseStream(jsonReadFile(...)) directly.

I'd say that the issue is in decode. It is expected to either decode the string or return it as-is. In this case, we would like it to be returned as-is, but it is being processed by base16_decode.

I think we should do (https://github.com/Paebbels/JSON-for-VHDL/blob/master/src/JSON.pkg.vhdl#L282-L290):

		case str(1) is
			when '{'|'['|'.'|'/'|'\' =>
			        -- It's a not encoded string (an object, a list, or a path on Linux)
				return str;
			when others =>
				if
				  -- Is it a Windows path?
				  (str(2) = ':')
				  or
				  -- Is it a filename?
				  ( ".json" = str(str'length-4 to str'length) )
				then
					return str;
				end if;
				return base16_decode(str);
		end case;

umarcor avatar Dec 07 '21 04:12 umarcor