{
static char *w_readonly = N_("W10: Warning: Changing a readonly file");
- if (curbuf->b_did_warn == FALSE
- && curbufIsChanged() == 0
- && !autocmd_busy
- && curbuf->b_p_ro)
- {
- ++curbuf_lock;
- apply_autocmds(EVENT_FILECHANGEDRO, NULL, NULL, FALSE, curbuf);
- --curbuf_lock;
- if (!curbuf->b_p_ro)
- return;
+ if (curbuf->b_did_warn
+ || curbufIsChanged()
+ || autocmd_busy
+ || !curbuf->b_p_ro)
+ return;
+
+ ++curbuf_lock;
+ apply_autocmds(EVENT_FILECHANGEDRO, NULL, NULL, FALSE, curbuf);
+ --curbuf_lock;
+ if (!curbuf->b_p_ro)
+ return;
- // Do what msg() does, but with a column offset if the warning should
- // be after the mode message.
- msg_start();
- if (msg_row == Rows - 1)
- msg_col = col;
- msg_source(HL_ATTR(HLF_W));
- msg_puts_attr(_(w_readonly), HL_ATTR(HLF_W) | MSG_HIST);
+ // Do what msg() does, but with a column offset if the warning should
+ // be after the mode message.
+ msg_start();
+ if (msg_row == Rows - 1)
+ msg_col = col;
+ msg_source(HL_ATTR(HLF_W));
+ msg_puts_attr(_(w_readonly), HL_ATTR(HLF_W) | MSG_HIST);
#ifdef FEAT_EVAL
- set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
+ set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1);
#endif
- msg_clr_eos();
- (void)msg_end();
- if (msg_silent == 0 && !silent_mode
+ msg_clr_eos();
+ (void)msg_end();
+ if (msg_silent == 0 && !silent_mode
#ifdef FEAT_EVAL
- && time_for_testing != 1
+ && time_for_testing != 1
#endif
- )
- {
- out_flush();
- ui_delay(1002L, TRUE); // give the user time to think about it
- }
- curbuf->b_did_warn = TRUE;
- redraw_cmdline = FALSE; // don't redraw and erase the message
- if (msg_row < Rows - 1)
- showmode();
+ )
+ {
+ out_flush();
+ ui_delay(1002L, TRUE); // give the user time to think about it
}
+ curbuf->b_did_warn = TRUE;
+ redraw_cmdline = FALSE; // don't redraw and erase the message
+ if (msg_row < Rows - 1)
+ showmode();
}
/*
linenr_T lnume,
long xtra)
{
- if (buf->b_recorded_changes != NULL && xtra != 0)
- {
- listitem_T *li;
- linenr_T prev_lnum;
- linenr_T prev_lnume;
+ if (buf->b_recorded_changes == NULL || xtra == 0)
+ return;
+
+ listitem_T *li;
+ linenr_T prev_lnum;
+ linenr_T prev_lnume;
- FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
+ FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
+ {
+ prev_lnum = (linenr_T)dict_get_number(
+ li->li_tv.vval.v_dict, "lnum");
+ prev_lnume = (linenr_T)dict_get_number(
+ li->li_tv.vval.v_dict, "end");
+ if (prev_lnum >= lnum || prev_lnum > lnume || prev_lnume >= lnum)
{
- prev_lnum = (linenr_T)dict_get_number(
- li->li_tv.vval.v_dict, "lnum");
- prev_lnume = (linenr_T)dict_get_number(
- li->li_tv.vval.v_dict, "end");
- if (prev_lnum >= lnum || prev_lnum > lnume || prev_lnume >= lnum)
- {
- // the current change is going to make the line number in
- // the older change invalid, flush now
- invoke_listeners(curbuf);
- break;
- }
+ // the current change is going to make the line number in
+ // the older change invalid, flush now
+ invoke_listeners(curbuf);
+ break;
}
}
}
static void
ch_log_lead(const char *what, channel_T *ch, ch_part_T part)
{
- if (log_fd != NULL)
- {
+ if (log_fd == NULL)
+ return;
+
#ifdef FEAT_RELTIME
- proftime_T log_now;
+ proftime_T log_now;
- profile_start(&log_now);
- profile_sub(&log_now, &log_start);
- fprintf(log_fd, "%s ", profile_msg(&log_now));
+ profile_start(&log_now);
+ profile_sub(&log_now, &log_start);
+ fprintf(log_fd, "%s ", profile_msg(&log_now));
#endif
- if (ch != NULL)
- {
- if (part < PART_COUNT)
- fprintf(log_fd, "%son %d(%s): ",
- what, ch->ch_id, part_names[part]);
- else
- fprintf(log_fd, "%son %d: ", what, ch->ch_id);
- }
+ if (ch != NULL)
+ {
+ if (part < PART_COUNT)
+ fprintf(log_fd, "%son %d(%s): ",
+ what, ch->ch_id, part_names[part]);
else
- fprintf(log_fd, "%s: ", what);
+ fprintf(log_fd, "%son %d: ", what, ch->ch_id);
}
+ else
+ fprintf(log_fd, "%s: ", what);
}
#ifndef PROTO // prototype is in proto.h
void
ch_log(channel_T *ch, const char *fmt, ...)
{
- if (log_fd != NULL)
- {
- va_list ap;
+ if (log_fd == NULL)
+ return;
- ch_log_lead("", ch, PART_COUNT);
- va_start(ap, fmt);
- vfprintf(log_fd, fmt, ap);
- va_end(ap);
- fputc('\n', log_fd);
- fflush(log_fd);
- did_repeated_msg = 0;
- }
+ va_list ap;
+
+ ch_log_lead("", ch, PART_COUNT);
+ va_start(ap, fmt);
+ vfprintf(log_fd, fmt, ap);
+ va_end(ap);
+ fputc('\n', log_fd);
+ fflush(log_fd);
+ did_repeated_msg = 0;
}
#endif
static void
ch_error(channel_T *ch, const char *fmt, ...)
{
- if (log_fd != NULL)
- {
- va_list ap;
+ if (log_fd == NULL)
+ return;
- ch_log_lead("ERR ", ch, PART_COUNT);
- va_start(ap, fmt);
- vfprintf(log_fd, fmt, ap);
- va_end(ap);
- fputc('\n', log_fd);
- fflush(log_fd);
- did_repeated_msg = 0;
- }
+ va_list ap;
+
+ ch_log_lead("ERR ", ch, PART_COUNT);
+ va_start(ap, fmt);
+ vfprintf(log_fd, fmt, ap);
+ va_end(ap);
+ fputc('\n', log_fd);
+ fflush(log_fd);
+ did_repeated_msg = 0;
}
#ifdef MSWIN
static void
channel_free(channel_T *channel)
{
- if (!in_free_unref_items)
+ if (in_free_unref_items)
+ return;
+
+ if (safe_to_invoke_callback == 0)
+ channel->ch_to_be_freed = TRUE;
+ else
{
- if (safe_to_invoke_callback == 0)
- channel->ch_to_be_freed = TRUE;
- else
- {
- channel_free_contents(channel);
- channel_free_channel(channel);
- }
+ channel_free_contents(channel);
+ channel_free_channel(channel);
}
}
channel_T *channel;
ch_part_T part;
- if (fd != INVALID_FD)
- FOR_ALL_CHANNELS(channel)
- {
- for (part = PART_SOCK; part < PART_IN; ++part)
- if (channel->ch_part[part].ch_fd == fd)
- {
- *partp = part;
- return channel;
- }
- }
+ if (fd == INVALID_FD)
+ return NULL;
+
+ FOR_ALL_CHANNELS(channel)
+ {
+ for (part = PART_SOCK; part < PART_IN; ++part)
+ if (channel->ch_part[part].ch_fd == fd)
+ {
+ *partp = part;
+ return channel;
+ }
+ }
return NULL;
}
if (buf == NULL)
buf = buflist_findname_exp(name);
}
+
+ if (buf != NULL)
+ return buf;
+
+ buf = buflist_new(name == NULL || *name == NUL ? NULL : name,
+ NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
if (buf == NULL)
- {
- buf = buflist_new(name == NULL || *name == NUL ? NULL : name,
- NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
- if (buf == NULL)
- return NULL;
- prepare_buffer(buf);
+ return NULL;
+ prepare_buffer(buf);
- curbuf = buf;
- if (msg)
- ml_replace(1, (char_u *)(err ? "Reading from channel error..."
- : "Reading from channel output..."), TRUE);
- changed_bytes(1, 0);
- curbuf = save_curbuf;
- }
+ curbuf = buf;
+ if (msg)
+ ml_replace(1, (char_u *)(err ? "Reading from channel error..."
+ : "Reading from channel output..."), TRUE);
+ changed_bytes(1, 0);
+ curbuf = save_curbuf;
return buf;
}
{
sock_T *fd = &channel->ch_part[part].ch_fd;
- if (*fd != INVALID_FD)
+ if (*fd == INVALID_FD)
+ return;
+
+ if (part == PART_SOCK)
+ sock_close(*fd);
+ else
{
- if (part == PART_SOCK)
- sock_close(*fd);
- else
+ // When using a pty the same FD is set on multiple parts, only
+ // close it when the last reference is closed.
+ if ((part == PART_IN || channel->CH_IN_FD != *fd)
+ && (part == PART_OUT || channel->CH_OUT_FD != *fd)
+ && (part == PART_ERR || channel->CH_ERR_FD != *fd))
{
- // When using a pty the same FD is set on multiple parts, only
- // close it when the last reference is closed.
- if ((part == PART_IN || channel->CH_IN_FD != *fd)
- && (part == PART_OUT || channel->CH_OUT_FD != *fd)
- && (part == PART_ERR || channel->CH_ERR_FD != *fd))
- {
#ifdef MSWIN
- if (channel->ch_named_pipe)
- DisconnectNamedPipe((HANDLE)fd);
+ if (channel->ch_named_pipe)
+ DisconnectNamedPipe((HANDLE)fd);
#endif
- fd_close(*fd);
- }
+ fd_close(*fd);
}
- *fd = INVALID_FD;
-
- // channel is closed, may want to end the job if it was the last
- channel->ch_to_be_closed &= ~(1U << part);
}
+ *fd = INVALID_FD;
+
+ // channel is closed, may want to end the job if it was the last
+ channel->ch_to_be_closed &= ~(1U << part);
}
void
channel_set_options(channel, options);
- if (job->jv_in_buf != NULL)
- {
- chanpart_T *in_part = &channel->ch_part[PART_IN];
+ if (job->jv_in_buf == NULL)
+ return;
+
+ chanpart_T *in_part = &channel->ch_part[PART_IN];
- set_bufref(&in_part->ch_bufref, job->jv_in_buf);
- ch_log(channel, "reading from buffer '%s'",
- (char *)in_part->ch_bufref.br_buf->b_ffname);
- if (options->jo_set & JO_IN_TOP)
+ set_bufref(&in_part->ch_bufref, job->jv_in_buf);
+ ch_log(channel, "reading from buffer '%s'",
+ (char *)in_part->ch_bufref.br_buf->b_ffname);
+ if (options->jo_set & JO_IN_TOP)
+ {
+ if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
{
- if (options->jo_in_top == 0 && !(options->jo_set & JO_IN_BOT))
- {
- // Special mode: send last-but-one line when appending a line
- // to the buffer.
- in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
- in_part->ch_buf_append = TRUE;
- in_part->ch_buf_top =
- in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
- }
- else
- in_part->ch_buf_top = options->jo_in_top;
+ // Special mode: send last-but-one line when appending a line
+ // to the buffer.
+ in_part->ch_bufref.br_buf->b_write_to_channel = TRUE;
+ in_part->ch_buf_append = TRUE;
+ in_part->ch_buf_top =
+ in_part->ch_bufref.br_buf->b_ml.ml_line_count + 1;
}
else
- in_part->ch_buf_top = 1;
- if (options->jo_set & JO_IN_BOT)
- in_part->ch_buf_bot = options->jo_in_bot;
- else
- in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
+ in_part->ch_buf_top = options->jo_in_top;
}
+ else
+ in_part->ch_buf_top = 1;
+ if (options->jo_set & JO_IN_BOT)
+ in_part->ch_buf_bot = options->jo_in_bot;
+ else
+ in_part->ch_buf_bot = in_part->ch_bufref.br_buf->b_ml.ml_line_count;
}
/*
cbq_T *head = &channel->ch_part[part].ch_cb_head;
cbq_T *item = ALLOC_ONE(cbq_T);
- if (item != NULL)
- {
- copy_callback(&item->cq_callback, callback);
- item->cq_seq_nr = id;
- item->cq_prev = head->cq_prev;
- head->cq_prev = item;
- item->cq_next = NULL;
- if (item->cq_prev == NULL)
- head->cq_next = item;
- else
- item->cq_prev->cq_next = item;
- }
+ if (item == NULL)
+ return;
+
+ copy_callback(&item->cq_callback, callback);
+ item->cq_seq_nr = id;
+ item->cq_prev = head->cq_prev;
+ head->cq_prev = item;
+ item->cq_next = NULL;
+ if (item->cq_prev == NULL)
+ head->cq_next = item;
+ else
+ item->cq_prev->cq_next = item;
}
static void
newitem = ALLOC_ONE(jsonq_T);
if (newitem == NULL)
+ {
+ clear_tv(rettv);
+ return;
+ }
+
+ newitem->jq_value = alloc_tv();
+ if (newitem->jq_value == NULL)
+ {
+ vim_free(newitem);
clear_tv(rettv);
+ return;
+ }
+
+ newitem->jq_no_callback = FALSE;
+ *newitem->jq_value = *rettv;
+ if (item == NULL)
+ {
+ // append to the end
+ newitem->jq_prev = head->jq_prev;
+ head->jq_prev = newitem;
+ newitem->jq_next = NULL;
+ if (newitem->jq_prev == NULL)
+ head->jq_next = newitem;
+ else
+ newitem->jq_prev->jq_next = newitem;
+ }
else
{
- newitem->jq_value = alloc_tv();
- if (newitem->jq_value == NULL)
- {
- vim_free(newitem);
- clear_tv(rettv);
- }
+ // append after "item"
+ newitem->jq_prev = item;
+ newitem->jq_next = item->jq_next;
+ item->jq_next = newitem;
+ if (newitem->jq_next == NULL)
+ head->jq_prev = newitem;
else
- {
- newitem->jq_no_callback = FALSE;
- *newitem->jq_value = *rettv;
- if (item == NULL)
- {
- // append to the end
- newitem->jq_prev = head->jq_prev;
- head->jq_prev = newitem;
- newitem->jq_next = NULL;
- if (newitem->jq_prev == NULL)
- head->jq_next = newitem;
- else
- newitem->jq_prev->jq_next = newitem;
- }
- else
- {
- // append after "item"
- newitem->jq_prev = item;
- newitem->jq_next = item->jq_next;
- item->jq_next = newitem;
- if (newitem->jq_next == NULL)
- head->jq_prev = newitem;
- else
- newitem->jq_next->jq_prev = newitem;
- }
- }
+ newitem->jq_next->jq_prev = newitem;
}
}
if (opt.jo_set & JO_PART)
part = opt.jo_part;
channel = get_channel_arg(&argvars[0], TRUE, TRUE, part);
- if (channel != NULL)
- {
- if (part == PART_COUNT)
- part = channel_part_read(channel);
- mode = channel_get_mode(channel, part);
- timeout = channel_get_timeout(channel, part);
- if (opt.jo_set & JO_TIMEOUT)
- timeout = opt.jo_timeout;
+ if (channel == NULL)
+ goto theend;
+
+ if (part == PART_COUNT)
+ part = channel_part_read(channel);
+ mode = channel_get_mode(channel, part);
+ timeout = channel_get_timeout(channel, part);
+ if (opt.jo_set & JO_TIMEOUT)
+ timeout = opt.jo_timeout;
- if (blob)
+ if (blob)
+ {
+ int outlen = 0;
+ char_u *p = channel_read_block(channel, part,
+ timeout, TRUE, &outlen);
+ if (p != NULL)
{
- int outlen = 0;
- char_u *p = channel_read_block(channel, part,
- timeout, TRUE, &outlen);
- if (p != NULL)
- {
- blob_T *b = blob_alloc();
+ blob_T *b = blob_alloc();
- if (b != NULL)
+ if (b != NULL)
+ {
+ b->bv_ga.ga_len = outlen;
+ if (ga_grow(&b->bv_ga, outlen) == FAIL)
+ blob_free(b);
+ else
{
- b->bv_ga.ga_len = outlen;
- if (ga_grow(&b->bv_ga, outlen) == FAIL)
- blob_free(b);
- else
- {
- memcpy(b->bv_ga.ga_data, p, outlen);
- rettv_blob_set(rettv, b);
- }
+ memcpy(b->bv_ga.ga_data, p, outlen);
+ rettv_blob_set(rettv, b);
}
- vim_free(p);
}
+ vim_free(p);
+ }
+ }
+ else if (raw || mode == CH_MODE_RAW || mode == CH_MODE_NL)
+ rettv->vval.v_string = channel_read_block(channel, part,
+ timeout, raw, NULL);
+ else
+ {
+ if (opt.jo_set & JO_ID)
+ id = opt.jo_id;
+ channel_read_json_block(channel, part, timeout, id, &listtv);
+ if (listtv != NULL)
+ {
+ *rettv = *listtv;
+ vim_free(listtv);
}
- else if (raw || mode == CH_MODE_RAW || mode == CH_MODE_NL)
- rettv->vval.v_string = channel_read_block(channel, part,
- timeout, raw, NULL);
else
{
- if (opt.jo_set & JO_ID)
- id = opt.jo_id;
- channel_read_json_block(channel, part, timeout, id, &listtv);
- if (listtv != NULL)
- {
- *rettv = *listtv;
- vim_free(listtv);
- }
- else
- {
- rettv->v_type = VAR_SPECIAL;
- rettv->vval.v_number = VVAL_NONE;
- }
+ rettv->v_type = VAR_SPECIAL;
+ rettv->vval.v_number = VVAL_NONE;
}
}
for (part = PART_SOCK; part < PART_IN; ++part)
{
fd = channel->ch_part[part].ch_fd;
- if (fd != INVALID_FD)
- {
- int r = channel_wait(channel, fd, 0);
+ if (fd == INVALID_FD)
+ continue;
- if (r == CW_READY)
- channel_read(channel, part, "channel_handle_events");
- else if (r == CW_ERROR)
- ch_close_part_on_error(channel, part, TRUE,
- "channel_handle_events");
- }
+ int r = channel_wait(channel, fd, 0);
+
+ if (r == CW_READY)
+ channel_read(channel, part, "channel_handle_events");
+ else if (r == CW_ERROR)
+ ch_close_part_on_error(channel, part, TRUE,
+ "channel_handle_events");
}
# ifdef __HAIKU__
chanpart_T *ch_part = &channel->ch_part[part];
int fd = ch_part->ch_fd;
- if (fd != INVALID_FD)
- {
+ if (fd == INVALID_FD)
+ return;
+
#ifdef MSWIN
- u_long val = 1;
+ u_long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
+ ioctlsocket(fd, FIONBIO, &val);
#else
- (void)fcntl(fd, F_SETFL, O_NONBLOCK);
+ (void)fcntl(fd, F_SETFL, O_NONBLOCK);
#endif
- ch_part->ch_nonblocking = TRUE;
- }
+ ch_part->ch_nonblocking = TRUE;
}
/*
void
f_ch_getbufnr(typval_T *argvars, typval_T *rettv)
{
- channel_T *channel;
+ channel_T *channel;
rettv->vval.v_number = -1;
return;
channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- if (channel != NULL)
- {
- char_u *what = tv_get_string(&argvars[1]);
- int part;
+ if (channel == NULL)
+ return;
- if (STRCMP(what, "err") == 0)
- part = PART_ERR;
- else if (STRCMP(what, "out") == 0)
- part = PART_OUT;
- else if (STRCMP(what, "in") == 0)
- part = PART_IN;
- else
- part = PART_SOCK;
- if (channel->ch_part[part].ch_bufref.br_buf != NULL)
- rettv->vval.v_number =
- channel->ch_part[part].ch_bufref.br_buf->b_fnum;
- }
+ char_u *what = tv_get_string(&argvars[1]);
+ int part;
+ if (STRCMP(what, "err") == 0)
+ part = PART_ERR;
+ else if (STRCMP(what, "out") == 0)
+ part = PART_OUT;
+ else if (STRCMP(what, "in") == 0)
+ part = PART_IN;
+ else
+ part = PART_SOCK;
+ if (channel->ch_part[part].ch_bufref.br_buf != NULL)
+ rettv->vval.v_number =
+ channel->ch_part[part].ch_bufref.br_buf->b_fnum;
}
/*
return;
channel = get_channel_arg(&argvars[0], FALSE, FALSE, 0);
- if (channel != NULL)
- {
- rettv->v_type = VAR_JOB;
- rettv->vval.v_job = channel->ch_job;
- if (channel->ch_job != NULL)
- ++channel->ch_job->jv_refcount;
- }
+ if (channel == NULL)
+ return;
+
+ rettv->v_type = VAR_JOB;
+ rettv->vval.v_job = channel->ch_job;
+ if (channel->ch_job != NULL)
+ ++channel->ch_job->jv_refcount;
}
/*