Function report |
Source Code:kernel\trace\trace_events_filter.c |
Create Date:2022-07-28 12:23:58 |
| Last Modify:2022-05-22 20:19:57 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:Without going into a formal proof, this explains the method that is used in* parsing the logical expressions
Proto:static struct prog_entry *predicate_parse(const char *str, int nr_parens, int nr_preds, parse_pred_fn parse_pred, void *data, struct filter_parse_error *pe)
Type:struct prog_entry
Parameter:
| Type | Parameter | Name |
|---|---|---|
| const char * | str | |
| int | nr_parens | |
| int | nr_preds | |
| parse_pred_fn | parse_pred | |
| void * | data | |
| struct filter_parse_error * | pe |
| 417 | char * inverts = NULL |
| 420 | invert = 0 |
| 423 | N = 0 |
| 426 | nr_preds += 2 |
| 428 | op_stack = kmalloc_array - allocate memory for an array.*@n: number of elements.*@size: element size.*@flags: the type of memory to allocate (see kmalloc). |
| 431 | prog_stack = kcalloc - allocate memory for an array. The memory is set to zero.*@n: number of elements.*@size: element size.*@flags: the type of memory to allocate (see kmalloc). |
| 432 | If Not prog_stack Then |
| 433 | parse_error(pe, - ENOMEM, 0) |
| 434 | Go to out_free |
| 436 | inverts = kmalloc_array - allocate memory for an array.*@n: number of elements.*@size: element size.*@flags: the type of memory to allocate (see kmalloc). |
| 437 | If Not inverts Then |
| 438 | parse_error(pe, - ENOMEM, 0) |
| 439 | Go to out_free |
| 443 | prog = prog_stack |
| 444 | top = 0 |
| 450 | If Note: isspace() must return false for %NUL-terminator ( * next) Then Continue |
| 454 | Case next == '(' |
| 460 | Continue |
| 461 | Case next == '!' |
| 462 | If Not Called after a '!' character but "!=" and "!~" are not "not"s Then Break |
| 465 | Continue |
| 469 | parse_error(pe, FILT_ERR_TOO_MANY_PREDS, next - str) |
| 470 | Go to out_free |
| 477 | If len < 0 Then |
| 483 | N++ |
| 485 | ret = -1 |
| 486 | When 1 cycle |
| 488 | If Note: isspace() must return false for %NUL-terminator ( * next) Then Continue |
| 492 | Case next == ')' |
| 493 | Case next == '\0' |
| 494 | Break |
| 495 | Case next == '&' |
| 496 | Case next == '|' |
| 503 | Default |
| 504 | parse_error(pe, FILT_ERR_TOO_MANY_PREDS, next - str) |
| 506 | Go to out_free |
| 511 | If top & PROCESS_AND Then |
| 513 | top &= ~PROCESS_AND |
| 515 | If next == '&' Then |
| 516 | top |= PROCESS_AND |
| 517 | Break |
| 519 | If top & PROCESS_OR Then |
| 521 | top &= ~PROCESS_OR |
| 523 | If next == '|' Then |
| 524 | top |= PROCESS_OR |
| 525 | Break |
| 536 | top-- |
| 539 | out : |
| 542 | parse_error(pe, FILT_ERR_TOO_MANY_OPEN, ptr - str) |
| 543 | Go to out_free |
| 546 | If Not N Then |
| 553 | pred = NULL |
| 554 | target = 1 |
| 555 | pred = NULL |
| 556 | target = 0 |
| 558 | when_to_branch = false |
| 563 | If when_to_branch == when_to_branch Then target = target |
| 569 | invert = inverts[i] ^ when_to_branch |
| 570 | when_to_branch = invert |
| 580 | Return prog |
| 581 | out_free : |
| 584 | If prog_stack Then |
| Name | Describe |
|---|---|
| process_preds |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |