@@ -95,6 +95,7 @@ const Symbols = struct {
9595 score_control : Symbol ,
9696 score_dict : Symbol ,
9797 score_list_ops : Symbol ,
98+ score_str_ops : Symbol ,
9899};
99100
100101pub fn init (allocator : std.mem.Allocator , reader : * FuzzReader ) Self {
@@ -211,6 +212,7 @@ pub fn generate(self: *Self) std.mem.Allocator.Error!void {
211212 .score_control = self .fresh (.function ),
212213 .score_dict = self .fresh (.function ),
213214 .score_list_ops = self .fresh (.function ),
215+ .score_str_ops = self .fresh (.function ),
214216 };
215217
216218 try self .setFileNames (app_file , platform_file , module_file );
@@ -594,6 +596,7 @@ fn writeTopLevelFunctions(self: *Self) std.mem.Allocator.Error!void {
594596 try self .writeControlFlowScoring ();
595597 try self .writeDictScoring ();
596598 try self .writeListOpsScoring ();
599+ try self .writeStrOpsScoring ();
597600}
598601
599602fn writeMakeItem (self : * Self ) std.mem.Allocator.Error ! void {
@@ -2157,6 +2160,250 @@ fn writeListOpsScoring(self: *Self) std.mem.Allocator.Error!void {
21572160 try self .writeAppText (")\n }\n\n " );
21582161}
21592162
2163+ fn writeStrOpsScoring (self : * Self ) std.mem.Allocator.Error ! void {
2164+ const text = self .fresh (.value );
2165+ const seed = self .fresh (.value );
2166+ const delimiter = self .fresh (.value );
2167+ const suffix = self .fresh (.value );
2168+ const joined_seed = self .fresh (.value );
2169+ const normalized = self .fresh (.value );
2170+ const repeated = self .fresh (.value );
2171+ const prefixed = self .fresh (.value );
2172+ const dropped = self .fresh (.value );
2173+ const pieces = self .fresh (.value );
2174+ const joined = self .fresh (.value );
2175+ const bytes = self .fresh (.value );
2176+ const roundtrip = self .fresh (.value );
2177+ const roundtrip_ok = self .fresh (.value );
2178+ const quoted = self .fresh (.value );
2179+ const quoted_ok = self .fresh (.value );
2180+ const reserved = self .fresh (.value );
2181+ const contains_score = self .fresh (.value );
2182+ const starts_score = self .fresh (.value );
2183+ const ends_score = self .fresh (.value );
2184+
2185+ try self .writeAppSymbol (self .symbols .score_str_ops );
2186+ try self .writeAppText (" : Str, U64 -> U64\n " );
2187+ try self .writeAppSymbol (self .symbols .score_str_ops );
2188+ try self .writeAppText (" = |" );
2189+ try self .writeAppSymbol (text );
2190+ try self .writeAppText (", " );
2191+ try self .writeAppSymbol (seed );
2192+ try self .writeAppText ("| {\n " );
2193+
2194+ try self .writeIndent (1 );
2195+ try self .writeAppSymbol (delimiter );
2196+ try self .writeAppText (" : Str\n " );
2197+ try self .writeIndent (1 );
2198+ try self .writeAppSymbol (delimiter );
2199+ try self .writeAppText (" = " );
2200+ try self .writeNonEmptyStringLiteral ();
2201+ try self .writeAppText ("\n " );
2202+
2203+ try self .writeIndent (1 );
2204+ try self .writeAppSymbol (suffix );
2205+ try self .writeAppText (" : Str\n " );
2206+ try self .writeIndent (1 );
2207+ try self .writeAppSymbol (suffix );
2208+ try self .writeAppText (" = " );
2209+ try self .writeNonEmptyStringLiteral ();
2210+ try self .writeAppText ("\n " );
2211+
2212+ try self .writeIndent (1 );
2213+ try self .writeAppSymbol (joined_seed );
2214+ try self .writeAppText (" : Str\n " );
2215+ try self .writeIndent (1 );
2216+ try self .writeAppSymbol (joined_seed );
2217+ try self .writeAppText (" = Str.concat(Str.trim(" );
2218+ try self .writeAppSymbol (text );
2219+ try self .writeAppText ("), U64.to_str(" );
2220+ try self .writeAppSymbol (seed );
2221+ try self .writeAppText ("))\n " );
2222+
2223+ try self .writeIndent (1 );
2224+ try self .writeAppSymbol (normalized );
2225+ try self .writeAppText (" : Str\n " );
2226+ try self .writeIndent (1 );
2227+ try self .writeAppSymbol (normalized );
2228+ try self .writeAppText (" = Str.with_ascii_lowercased(Str.with_ascii_uppercased(" );
2229+ try self .writeAppSymbol (joined_seed );
2230+ try self .writeAppText ("))\n " );
2231+
2232+ try self .writeIndent (1 );
2233+ try self .writeAppSymbol (repeated );
2234+ try self .writeAppText (" : Str\n " );
2235+ try self .writeIndent (1 );
2236+ try self .writeAppSymbol (repeated );
2237+ try self .writeAppText (" = Str.repeat(" );
2238+ try self .writeAppSymbol (delimiter );
2239+ try self .writeAppText (", " );
2240+ try self .writeAppSymbol (seed );
2241+ try self .writeAppText (" % 4 + 1)\n " );
2242+
2243+ try self .writeIndent (1 );
2244+ try self .writeAppSymbol (prefixed );
2245+ try self .writeAppText (" : Str\n " );
2246+ try self .writeIndent (1 );
2247+ try self .writeAppSymbol (prefixed );
2248+ try self .writeAppText (" = Str.with_prefix(Str.concat(" );
2249+ try self .writeAppSymbol (normalized );
2250+ try self .writeAppText (", " );
2251+ try self .writeAppSymbol (suffix );
2252+ try self .writeAppText ("), " );
2253+ try self .writeAppSymbol (repeated );
2254+ try self .writeAppText (")\n " );
2255+
2256+ try self .writeIndent (1 );
2257+ try self .writeAppSymbol (dropped );
2258+ try self .writeAppText (" : Str\n " );
2259+ try self .writeIndent (1 );
2260+ try self .writeAppSymbol (dropped );
2261+ try self .writeAppText (" = Str.drop_suffix(Str.drop_prefix(" );
2262+ try self .writeAppSymbol (prefixed );
2263+ try self .writeAppText (", " );
2264+ try self .writeAppSymbol (repeated );
2265+ try self .writeAppText ("), " );
2266+ try self .writeAppSymbol (suffix );
2267+ try self .writeAppText (")\n " );
2268+
2269+ try self .writeIndent (1 );
2270+ try self .writeAppSymbol (pieces );
2271+ try self .writeAppText (" : List(Str)\n " );
2272+ try self .writeIndent (1 );
2273+ try self .writeAppSymbol (pieces );
2274+ try self .writeAppText (" = Str.split_on(Str.concat(" );
2275+ try self .writeAppSymbol (dropped );
2276+ try self .writeAppText (", " );
2277+ try self .writeAppSymbol (delimiter );
2278+ try self .writeAppText ("), " );
2279+ try self .writeAppSymbol (delimiter );
2280+ try self .writeAppText (")\n " );
2281+
2282+ try self .writeIndent (1 );
2283+ try self .writeAppSymbol (joined );
2284+ try self .writeAppText (" : Str\n " );
2285+ try self .writeIndent (1 );
2286+ try self .writeAppSymbol (joined );
2287+ try self .writeAppText (" = Str.join_with(" );
2288+ try self .writeAppSymbol (pieces );
2289+ try self .writeAppText (", " );
2290+ try self .writeAppSymbol (delimiter );
2291+ try self .writeAppText (")\n " );
2292+
2293+ try self .writeIndent (1 );
2294+ try self .writeAppSymbol (bytes );
2295+ try self .writeAppText (" : List(U8)\n " );
2296+ try self .writeIndent (1 );
2297+ try self .writeAppSymbol (bytes );
2298+ try self .writeAppText (" = Str.to_utf8(" );
2299+ try self .writeAppSymbol (joined );
2300+ try self .writeAppText (")\n " );
2301+
2302+ try self .writeIndent (1 );
2303+ try self .writeAppSymbol (roundtrip );
2304+ try self .writeAppText (" : Str\n " );
2305+ try self .writeIndent (1 );
2306+ try self .writeAppSymbol (roundtrip );
2307+ try self .writeAppText (" = match Str.from_utf8(" );
2308+ try self .writeAppSymbol (bytes );
2309+ try self .writeAppText (") {\n " );
2310+ try self .writeIndent (2 );
2311+ try self .writeAppText ("Ok(" );
2312+ try self .writeAppSymbol (roundtrip_ok );
2313+ try self .writeAppText (") => " );
2314+ try self .writeAppSymbol (roundtrip_ok );
2315+ try self .writeAppText ("\n " );
2316+ try self .writeIndent (2 );
2317+ try self .writeAppText ("Err(_) => Str.from_utf8_lossy(" );
2318+ try self .writeAppSymbol (bytes );
2319+ try self .writeAppText (")\n " );
2320+ try self .writeIndent (1 );
2321+ try self .writeAppText ("}\n " );
2322+
2323+ try self .writeIndent (1 );
2324+ try self .writeAppSymbol (quoted );
2325+ try self .writeAppText (" : Str\n " );
2326+ try self .writeIndent (1 );
2327+ try self .writeAppSymbol (quoted );
2328+ try self .writeAppText (" = match Str.from_quote(" );
2329+ try self .writeAppSymbol (joined );
2330+ try self .writeAppText (") {\n " );
2331+ try self .writeIndent (2 );
2332+ try self .writeAppText ("Ok(" );
2333+ try self .writeAppSymbol (quoted_ok );
2334+ try self .writeAppText (") => " );
2335+ try self .writeAppSymbol (quoted_ok );
2336+ try self .writeAppText ("\n " );
2337+ try self .writeIndent (2 );
2338+ try self .writeAppText ("Err(_) => " );
2339+ try self .writeAppSymbol (joined );
2340+ try self .writeAppText ("\n " );
2341+ try self .writeIndent (1 );
2342+ try self .writeAppText ("}\n " );
2343+
2344+ try self .writeIndent (1 );
2345+ try self .writeAppSymbol (reserved );
2346+ try self .writeAppText (" : Str\n " );
2347+ try self .writeIndent (1 );
2348+ try self .writeAppSymbol (reserved );
2349+ try self .writeAppText (" = Str.release_excess_capacity(Str.reserve(Str.with_capacity(List.len(" );
2350+ try self .writeAppSymbol (bytes );
2351+ try self .writeAppText (")), " );
2352+ try self .writeAppSymbol (seed );
2353+ try self .writeAppText (" % 8))\n " );
2354+
2355+ try self .writeIndent (1 );
2356+ try self .writeAppSymbol (contains_score );
2357+ try self .writeAppText (" : U64\n " );
2358+ try self .writeIndent (1 );
2359+ try self .writeAppSymbol (contains_score );
2360+ try self .writeAppText (" = if Str.contains(" );
2361+ try self .writeAppSymbol (joined );
2362+ try self .writeAppText (", " );
2363+ try self .writeAppSymbol (delimiter );
2364+ try self .writeAppText (") 1 else 0\n " );
2365+
2366+ try self .writeIndent (1 );
2367+ try self .writeAppSymbol (starts_score );
2368+ try self .writeAppText (" : U64\n " );
2369+ try self .writeIndent (1 );
2370+ try self .writeAppSymbol (starts_score );
2371+ try self .writeAppText (" = if Str.starts_with(" );
2372+ try self .writeAppSymbol (prefixed );
2373+ try self .writeAppText (", " );
2374+ try self .writeAppSymbol (repeated );
2375+ try self .writeAppText (") 2 else 0\n " );
2376+
2377+ try self .writeIndent (1 );
2378+ try self .writeAppSymbol (ends_score );
2379+ try self .writeAppText (" : U64\n " );
2380+ try self .writeIndent (1 );
2381+ try self .writeAppSymbol (ends_score );
2382+ try self .writeAppText (" = if Str.ends_with(Str.concat(" );
2383+ try self .writeAppSymbol (joined );
2384+ try self .writeAppText (", " );
2385+ try self .writeAppSymbol (suffix );
2386+ try self .writeAppText ("), " );
2387+ try self .writeAppSymbol (suffix );
2388+ try self .writeAppText (") 3 else 0\n " );
2389+
2390+ try self .writeIndent (1 );
2391+ try self .writeAppSymbol (contains_score );
2392+ try self .writeAppText (" + " );
2393+ try self .writeAppSymbol (starts_score );
2394+ try self .writeAppText (" + " );
2395+ try self .writeAppSymbol (ends_score );
2396+ try self .writeAppText (" + List.len(" );
2397+ try self .writeAppSymbol (bytes );
2398+ try self .writeAppText (") + List.len(Str.to_utf8(" );
2399+ try self .writeAppSymbol (roundtrip );
2400+ try self .writeAppText (")) + List.len(Str.to_utf8(" );
2401+ try self .writeAppSymbol (quoted );
2402+ try self .writeAppText (")) + List.len(Str.to_utf8(" );
2403+ try self .writeAppSymbol (reserved );
2404+ try self .writeAppText ("))\n }\n\n " );
2405+ }
2406+
21602407fn writeEntryPoint (self : * Self ) std.mem.Allocator.Error ! void {
21612408 const input = self .fresh (.value );
21622409 const first = self .fresh (.value );
@@ -2177,6 +2424,7 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
21772424 const control_score = self .fresh (.value );
21782425 const dict_score = self .fresh (.value );
21792426 const list_ops_score = self .fresh (.value );
2427+ const str_score = self .fresh (.value );
21802428 const imported_record = self .fresh (.value );
21812429 const alternate_imported = self .fresh (.value );
21822430 const generic_imported = self .fresh (.value );
@@ -2426,6 +2674,19 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
24262674 try self .writeAppSymbol (dict_score );
24272675 try self .writeAppText (")\n " );
24282676
2677+ try self .writeIndent (1 );
2678+ try self .writeAppSymbol (str_score );
2679+ try self .writeAppText (" : U64\n " );
2680+ try self .writeIndent (1 );
2681+ try self .writeAppSymbol (str_score );
2682+ try self .writeAppText (" = " );
2683+ try self .writeAppSymbol (self .symbols .score_str_ops );
2684+ try self .writeAppText ("(" );
2685+ try self .writeAppSymbol (generic_text );
2686+ try self .writeAppText (", " );
2687+ try self .writeAppSymbol (list_ops_score );
2688+ try self .writeAppText (")\n " );
2689+
24292690 try self .writeLocalHeader (imported_record , self .symbols .imported_type );
24302691 try self .writeAppSymbol (self .symbols .imported_type );
24312692 try self .writeAppText ("." );
@@ -2444,6 +2705,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
24442705 try self .writeAppSymbol (dict_score );
24452706 try self .writeAppText (" + " );
24462707 try self .writeAppSymbol (list_ops_score );
2708+ try self .writeAppText (" + " );
2709+ try self .writeAppSymbol (str_score );
24472710 try self .writeAppText (", " );
24482711 try self .writeAppSymbol (generic_text );
24492712 try self .writeAppText (")\n " );
@@ -2574,6 +2837,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
25742837 try self .writeAppText (" + " );
25752838 try self .writeAppSymbol (list_ops_score );
25762839 try self .writeAppText (" + " );
2840+ try self .writeAppSymbol (str_score );
2841+ try self .writeAppText (" + " );
25772842 try self .writeAppSymbol (imported_score );
25782843 try self .writeAppText (" + " );
25792844 try self .writeAppSymbol (tree_score );
@@ -2607,6 +2872,8 @@ fn writeEntryPoint(self: *Self) std.mem.Allocator.Error!void {
26072872 try self .writeAppText (" + " );
26082873 try self .writeAppSymbol (list_ops_score );
26092874 try self .writeAppText (" + " );
2875+ try self .writeAppSymbol (str_score );
2876+ try self .writeAppText (" + " );
26102877 try self .writeAppSymbol (imported_score );
26112878 try self .writeAppText (" + " );
26122879 try self .writeAppSymbol (tree_score );
@@ -2701,7 +2968,15 @@ fn writeTreeNamed(self: *Self, text_seed: Symbol, depth: u8) std.mem.Allocator.E
27012968
27022969fn writeStringLiteral (self : * Self ) std.mem.Allocator.Error ! void {
27032970 const len = self .reader .intRangeAtMost (u8 , 0 , 4 );
2971+ try self .writeAsciiStringLiteral (len );
2972+ }
2973+
2974+ fn writeNonEmptyStringLiteral (self : * Self ) std.mem.Allocator.Error ! void {
2975+ const len = self .reader .intRangeAtMost (u8 , 1 , 4 );
2976+ try self .writeAsciiStringLiteral (len );
2977+ }
27042978
2979+ fn writeAsciiStringLiteral (self : * Self , len : u8 ) std.mem.Allocator.Error ! void {
27052980 try self .writeAppText ("\" " );
27062981 for (0.. len ) | _ | {
27072982 const byte = @as (u8 , 'a' ) + self .reader .intRangeLessThan (u8 , 0 , 26 );
0 commit comments