From 49358e7f09c956c1f2762f0e55f3cd4b8eab5822 Mon Sep 17 00:00:00 2001 From: Avinash Kumar Deepak Date: Thu, 5 Feb 2026 12:47:24 +0530 Subject: [PATCH 1/2] Fix literalEval() to parse Python-style dicts and lists - Replace empty HashMap return with actual parser - Handle dict format: {'key': value} - Handle list format: [val1, val2] - Fix read(), initVal(), defaultMaxTime() to use parser Fixes #197 --- concoredocker.java | 188 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 177 insertions(+), 11 deletions(-) diff --git a/concoredocker.java b/concoredocker.java index dde521c..4a653e0 100644 --- a/concoredocker.java +++ b/concoredocker.java @@ -58,8 +58,13 @@ private static Map parseFile(String filename) throws IOException private static void defaultMaxTime(int defaultValue) { try { - String content = new String(Files.readAllBytes(Paths.get(inpath + "1/concore.maxtime"))); - maxtime = literalEval(content).size(); + String content = new String(Files.readAllBytes(Paths.get(inpath + "1/concore.maxtime"))).trim(); + Object val = parsePythonLiteral(content); + if (val instanceof Number) { + maxtime = ((Number) val).intValue(); + } else { + maxtime = defaultValue; + } } catch (IOException e) { maxtime = defaultValue; } @@ -90,9 +95,16 @@ private static Object read(int port, String name, String initstr) { retrycount++; } s += ins; - Object[] inval = new Map[] { literalEval(ins) }; - int simtime = Math.max((int) inval[0], 0); // assuming simtime is an integer - return inval[1]; + Object[] inval = literalEvalList(ins); + if (inval.length > 0) { + int simtime = ((Number) inval[0]).intValue(); + if (inval.length > 1) { + Object[] result = new Object[inval.length - 1]; + System.arraycopy(inval, 1, result, 0, result.length); + return result; + } + } + return initstr; } catch (IOException | InterruptedException e) { return initstr; } @@ -129,13 +141,13 @@ private static void write(int port, String name, Object val, int delta) { } private static Object[] initVal(String simtimeVal) { - int simtime = 0; Object[] val = new Object[] {}; try { - Object[] arrayVal = new Map[] { literalEval(simtimeVal) }; - simtime = (int) arrayVal[0]; // assuming simtime is an integer - val = new Object[arrayVal.length - 1]; - System.arraycopy(arrayVal, 1, val, 0, val.length); + Object[] arrayVal = literalEvalList(simtimeVal); + if (arrayVal.length > 1) { + val = new Object[arrayVal.length - 1]; + System.arraycopy(arrayVal, 1, val, 0, val.length); + } } catch (Exception e) { e.printStackTrace(); } @@ -143,7 +155,161 @@ private static Object[] initVal(String simtimeVal) { } private static Map literalEval(String s) { - + Object result = parsePythonLiteral(s); + if (result instanceof Map) { + return (Map) result; + } return new HashMap<>(); } + + private static Object[] literalEvalList(String s) { + Object result = parsePythonLiteral(s); + if (result instanceof Object[]) { + return (Object[]) result; + } + return new Object[]{}; + } + + private static Object parsePythonLiteral(String s) { + if (s == null) return null; + s = s.trim(); + if (s.isEmpty()) return null; + + // dict: {'key': value, ...} + if (s.startsWith("{") && s.endsWith("}")) { + return parseDict(s.substring(1, s.length() - 1)); + } + // list: [val1, val2, ...] + if (s.startsWith("[") && s.endsWith("]")) { + return parseList(s.substring(1, s.length() - 1)); + } + // single value + return parseValue(s); + } + + private static Map parseDict(String inner) { + Map map = new HashMap<>(); + if (inner.trim().isEmpty()) return map; + + int i = 0; + while (i < inner.length()) { + // skip whitespace + while (i < inner.length() && Character.isWhitespace(inner.charAt(i))) i++; + if (i >= inner.length()) break; + + // parse key (quoted string) + char quote = inner.charAt(i); + if (quote != '\'' && quote != '"') break; + i++; + int keyStart = i; + while (i < inner.length() && inner.charAt(i) != quote) i++; + String key = inner.substring(keyStart, i); + i++; // skip closing quote + + // skip to colon + while (i < inner.length() && inner.charAt(i) != ':') i++; + i++; // skip colon + + // skip whitespace + while (i < inner.length() && Character.isWhitespace(inner.charAt(i))) i++; + + // parse value + int[] endIdx = new int[]{i}; + Object val = parseValueAt(inner, endIdx); + i = endIdx[0]; + map.put(key, val); + + // skip to comma or end + while (i < inner.length() && inner.charAt(i) != ',') i++; + i++; // skip comma + } + return map; + } + + private static Object[] parseList(String inner) { + if (inner.trim().isEmpty()) return new Object[]{}; + + java.util.List list = new java.util.ArrayList<>(); + int i = 0; + while (i < inner.length()) { + while (i < inner.length() && Character.isWhitespace(inner.charAt(i))) i++; + if (i >= inner.length()) break; + + int[] endIdx = new int[]{i}; + Object val = parseValueAt(inner, endIdx); + i = endIdx[0]; + list.add(val); + + while (i < inner.length() && (Character.isWhitespace(inner.charAt(i)) || inner.charAt(i) == ',')) i++; + } + return list.toArray(); + } + + private static Object parseValueAt(String s, int[] idx) { + int i = idx[0]; + while (i < s.length() && Character.isWhitespace(s.charAt(i))) i++; + if (i >= s.length()) { + idx[0] = i; + return null; + } + + char c = s.charAt(i); + // nested dict + if (c == '{') { + int depth = 1, start = i; + i++; + while (i < s.length() && depth > 0) { + if (s.charAt(i) == '{') depth++; + else if (s.charAt(i) == '}') depth--; + i++; + } + idx[0] = i; + return parsePythonLiteral(s.substring(start, i)); + } + // nested list + if (c == '[') { + int depth = 1, start = i; + i++; + while (i < s.length() && depth > 0) { + if (s.charAt(i) == '[') depth++; + else if (s.charAt(i) == ']') depth--; + i++; + } + idx[0] = i; + return parsePythonLiteral(s.substring(start, i)); + } + // quoted string + if (c == '\'' || c == '"') { + char quote = c; + i++; + int start = i; + while (i < s.length() && s.charAt(i) != quote) i++; + String val = s.substring(start, i); + i++; // skip closing quote + idx[0] = i; + return val; + } + // number or other + int start = i; + while (i < s.length() && s.charAt(i) != ',' && s.charAt(i) != '}' && s.charAt(i) != ']' && !Character.isWhitespace(s.charAt(i))) { + i++; + } + idx[0] = i; + return parseValue(s.substring(start, i)); + } + + private static Object parseValue(String s) { + s = s.trim(); + if (s.isEmpty()) return null; + if (s.equals("None") || s.equals("null")) return null; + if (s.equals("True") || s.equals("true")) return true; + if (s.equals("False") || s.equals("false")) return false; + try { + if (s.contains(".")) return Double.parseDouble(s); + return Integer.parseInt(s); + } catch (NumberFormatException e) { + return s; + } + } } + From 8853e3001858b49b3192e2675870f66781f063aa Mon Sep 17 00:00:00 2001 From: Avinash Kumar Deepak Date: Thu, 5 Feb 2026 12:49:29 +0530 Subject: [PATCH 2/2] Remove inline comments to match codebase style --- concoredocker.java | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/concoredocker.java b/concoredocker.java index 4a653e0..9dc5dcd 100644 --- a/concoredocker.java +++ b/concoredocker.java @@ -175,15 +175,12 @@ private static Object parsePythonLiteral(String s) { s = s.trim(); if (s.isEmpty()) return null; - // dict: {'key': value, ...} if (s.startsWith("{") && s.endsWith("}")) { return parseDict(s.substring(1, s.length() - 1)); } - // list: [val1, val2, ...] if (s.startsWith("[") && s.endsWith("]")) { return parseList(s.substring(1, s.length() - 1)); } - // single value return parseValue(s); } @@ -193,35 +190,29 @@ private static Map parseDict(String inner) { int i = 0; while (i < inner.length()) { - // skip whitespace while (i < inner.length() && Character.isWhitespace(inner.charAt(i))) i++; if (i >= inner.length()) break; - // parse key (quoted string) char quote = inner.charAt(i); if (quote != '\'' && quote != '"') break; i++; int keyStart = i; while (i < inner.length() && inner.charAt(i) != quote) i++; String key = inner.substring(keyStart, i); - i++; // skip closing quote + i++; - // skip to colon while (i < inner.length() && inner.charAt(i) != ':') i++; - i++; // skip colon + i++; - // skip whitespace while (i < inner.length() && Character.isWhitespace(inner.charAt(i))) i++; - // parse value int[] endIdx = new int[]{i}; Object val = parseValueAt(inner, endIdx); i = endIdx[0]; map.put(key, val); - // skip to comma or end while (i < inner.length() && inner.charAt(i) != ',') i++; - i++; // skip comma + i++; } return map; } @@ -254,7 +245,6 @@ private static Object parseValueAt(String s, int[] idx) { } char c = s.charAt(i); - // nested dict if (c == '{') { int depth = 1, start = i; i++; @@ -266,7 +256,6 @@ private static Object parseValueAt(String s, int[] idx) { idx[0] = i; return parsePythonLiteral(s.substring(start, i)); } - // nested list if (c == '[') { int depth = 1, start = i; i++; @@ -278,18 +267,16 @@ private static Object parseValueAt(String s, int[] idx) { idx[0] = i; return parsePythonLiteral(s.substring(start, i)); } - // quoted string if (c == '\'' || c == '"') { char quote = c; i++; int start = i; while (i < s.length() && s.charAt(i) != quote) i++; String val = s.substring(start, i); - i++; // skip closing quote + i++; idx[0] = i; return val; } - // number or other int start = i; while (i < s.length() && s.charAt(i) != ',' && s.charAt(i) != '}' && s.charAt(i) != ']' && !Character.isWhitespace(s.charAt(i))) { i++;