Last active
April 14, 2020 18:45
-
-
Save amiraliakbari/1aaaa1ce07777eb66b48 to your computer and use it in GitHub Desktop.
Interview Code Reading Questions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void gather_stats(const char *buf, unsigned long size, struct text_stat *stats) | |
{ | |
unsigned long i; | |
memset(stats, 0, sizeof(*stats)); | |
for (i = 0; i < size; i++) { | |
unsigned char c = buf[i]; | |
if (c == '\r') { | |
stats->cr++; | |
if (i+1 < size && buf[i+1] == '\n') | |
stats->crlf++; | |
continue; | |
} | |
if (c == '\n') { | |
stats->lf++; | |
continue; | |
} | |
if (c == 127) | |
/* DEL */ | |
stats->nonprintable++; | |
else if (c < 32) { | |
switch (c) { | |
/* BS, HT, ESC and FF */ | |
case '\b': case '\t': case '\033': case '\014': | |
stats->printable++; | |
break; | |
case 0: | |
stats->nul++; | |
/* fall through */ | |
default: | |
stats->nonprintable++; | |
} | |
} | |
else | |
stats->printable++; | |
} | |
if (size >= 1 && buf[size-1] == '\032') | |
stats->nonprintable--; | |
} | |
static int is_binary(unsigned long size, struct text_stat *stats) | |
{ | |
if (stats->nul) | |
return 1; | |
if ((stats->printable >> 7) < stats->nonprintable) | |
return 1; | |
/* | |
* Other heuristics? Average line length might be relevant, | |
* as might LF vs CR vs CRLF counts.. | |
* | |
* NOTE! It might be normal to have a low ratio of CRLF to LF | |
* (somebody starts with a LF-only file and edits it with an editor | |
* that adds CRLF only to lines that are added..). But do we | |
* want to support CR-only? Probably not. | |
*/ | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags) | |
{ | |
struct ring_buffer *rb; | |
unsigned long size; | |
int i; | |
size = sizeof(struct ring_buffer); | |
size += nr_pages * sizeof(void *); | |
rb = kzalloc(size, GFP_KERNEL); | |
if (!rb) | |
goto fail; | |
rb->user_page = perf_mmap_alloc_page(cpu); | |
if (!rb->user_page) | |
goto fail_user_page; | |
for (i = 0; i < nr_pages; i++) { | |
rb->data_pages[i] = perf_mmap_alloc_page(cpu); | |
if (!rb->data_pages[i]) | |
goto fail_data_pages; | |
} | |
rb->nr_pages = nr_pages; | |
ring_buffer_init(rb, watermark, flags); | |
return rb; | |
fail_data_pages: | |
for (i--; i >= 0; i--) | |
free_page((unsigned long)rb->data_pages[i]); | |
free_page((unsigned long)rb->user_page); | |
fail_user_page: | |
kfree(rb); | |
fail: | |
return NULL; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def split_args(args): | |
''' | |
Splits args on whitespace, but intelligently reassembles | |
those that may have been split over a jinja2 block or quotes. | |
Basically this is a variation shlex that has some more intelligence for | |
how Ansible needs to use it. | |
''' | |
params = [] | |
args = args.strip() | |
try: | |
args = args.encode('utf-8') | |
do_decode = True | |
except UnicodeDecodeError: | |
do_decode = False | |
items = args.split('\n') | |
quote_char = None | |
inside_quotes = False | |
print_depth = 0 # used to count nested jinja2 {{ }} blocks | |
block_depth = 0 # used to count nested jinja2 {% %} blocks | |
comment_depth = 0 # used to count nested jinja2 {# #} blocks | |
for itemidx,item in enumerate(items): | |
# we split on spaces and newlines separately, so that we | |
# can tell which character we split on for reassembly | |
# inside quotation characters | |
tokens = item.strip().split(' ') | |
line_continuation = False | |
for idx,token in enumerate(tokens): | |
if token == '\\' and not inside_quotes: | |
line_continuation = True | |
continue | |
# store the previous quoting state for checking later | |
was_inside_quotes = inside_quotes | |
quote_char = _get_quote_state(token, quote_char) | |
inside_quotes = quote_char is not None | |
appended = False | |
if inside_quotes and not was_inside_quotes: | |
params.append(token) | |
appended = True | |
elif print_depth or block_depth or comment_depth or inside_quotes or was_inside_quotes: | |
if idx == 0 and not inside_quotes and was_inside_quotes: | |
params[-1] = "%s%s" % (params[-1], token) | |
elif len(tokens) > 1: | |
spacer = '' | |
if idx > 0: | |
spacer = ' ' | |
params[-1] = "%s%s%s" % (params[-1], spacer, token) | |
else: | |
spacer = '' | |
if not params[-1].endswith('\n') and idx == 0: | |
spacer = '\n' | |
params[-1] = "%s%s%s" % (params[-1], spacer, token) | |
appended = True | |
# if the number of paired block tags is not the same, the depth has changed, so we calculate that here | |
# and may append the current token to the params (if we haven't previously done so) | |
prev_print_depth = print_depth | |
print_depth = _count_jinja2_blocks(token, print_depth, "{{", "}}") | |
if print_depth != prev_print_depth and not appended: | |
params.append(token) | |
appended = True | |
prev_block_depth = block_depth | |
block_depth = _count_jinja2_blocks(token, block_depth, "{%", "%}") | |
if block_depth != prev_block_depth and not appended: | |
params.append(token) | |
appended = True | |
prev_comment_depth = comment_depth | |
comment_depth = _count_jinja2_blocks(token, comment_depth, "{#", "#}") | |
if comment_depth != prev_comment_depth and not appended: | |
params.append(token) | |
appended = True | |
if not (print_depth or block_depth or comment_depth) and not inside_quotes and not appended and token != '': | |
params.append(token) | |
if len(items) > 1 and itemidx != len(items) - 1 and not line_continuation: | |
if not params[-1].endswith('\n') or item == '': | |
params[-1] += '\n' | |
line_continuation = False | |
if print_depth or block_depth or comment_depth or inside_quotes: | |
raise Exception("error while splitting arguments, either an unbalanced jinja2 block or quotes") | |
if do_decode: | |
params = [x.decode('utf-8') for x in params] | |
return params |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment